Pandas确实很棒,但令我惊讶的是,从Pandas.DataFrame检索值的效率低下。在下面的玩具示例中,即使DataFrame.iloc方法也比字典慢100倍以上。
问题:这里的教训仅仅是字典是查找价值的更好方法吗?是的,我知道那正是他们的目的。但是我只是想知道是否缺少有关DataFrame查找性能的信息。
我意识到这个问题比“提问”更“有趣”,但是我会接受一个提供洞察力或观点的答案。谢谢。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 10]))
dictionary = df.to_dict()
'''
f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
for func in f:
print func
print min(timeit.Timer(func, setup).repeat(3, 100000))
值=字典[5] [5]
0.130625009537
值= df.loc [5,5]
19.4681699276
值= df.iloc [5,5]
17.2575249672
字典对于DataFrame的要求就像自行车对汽车的要求一样。您可以比骑车快10英尺,比起启动汽车,使齿轮换挡等更快速。但是,如果您需要走一英里,汽车就可以胜出。
对于某些小的目标目标,命令可能会更快。如果这就是您所需要的,那么请确定使用dict!但是,如果您需要/想要DataFrame的强大功能,那么dict是无可替代的。如果数据结构首先不能满足您的需求,那么比较速度是没有意义的。
现在,例如-更具体地讲-一个dict对于访问列是很好的,但是对访问行却不是那么方便。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 1000]))
dictionary = df.to_dict()
'''
# f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
f = ['value = [val[5] for col,val in dictionary.items()]', 'value = df.loc[5]', 'value = df.iloc[5]']
for func in f:
print(func)
print(min(timeit.Timer(func, setup).repeat(3, 100000)))
产量
value = [val[5] for col,val in dictionary.iteritems()]
25.5416321754
value = df.loc[5]
5.68071913719
value = df.iloc[5]
4.56006002426
因此,列表的dict检索行的速度比慢5倍df.iloc
。随着列数的增加,速度不足会变得更大。(列数就像自行车比喻中的脚数。距离越长,汽车就越方便…)
这只是列表的字典不如DataFrame方便/慢的一个例子。
另一个示例是当您为各行设置了DatetimeIndex并希望选择某些日期之间的所有行时。有了DataFrame,您可以使用
df.loc['2000-1-1':'2000-3-31']
如果要使用列表字典,则没有简单的模拟方法。与DataFrame相比,您需要用于选择正确行的Python循环将再次非常慢。
问题内容: 我正在尝试过滤出包含产品列表的数据框。但是,我遇到了熊猫-每当我运行代码时,“ dataframe”对象都没有属性“ str”错误。 这是代码行: 如果有人有任何建议的想法,请告诉我。我已经搜索了很多次,而且非常困惑。 产品是对象数据类型。 编辑: 这是头: 编辑2:这是print(data),A是产品。当我将其打印出来时,看起来好像A不在类别产品下。 问题答案: 答案很简单: 改变成
问题内容: 我有一个4个熊猫数据框的列表,其中包含我想合并为一个数据框的一天的报价数据。我无法理解concat在时间戳上的行为。请参阅以下详细信息: 使用我得到: 使用我得到: 注意使用时索引如何变化。为什么会发生这种情况,我将如何使用该方法来重现使用所获得的结果?(因为看上去快得多;每个循环24.6 ms,而每个循环3.02 s) 问题答案: 因此,您正在执行的操作是append和concat
问题内容: 我有一个DataFrame,说一个波动率表面,索引为时间,列为行权。如何进行二维插值?我可以,但是我该如何处理?我知道我们可以,但是甚至不是线性插值。有没有办法插入我们自己的方法进行插值? 问题答案: 您可以用来获取线性插值。 对于更复杂的事情,您需要推出自己的函数来处理一个对象并根据需要填充值并返回另一个对象。
问题内容: 如何将条件逻辑应用于Pandas DataFrame。 请参见下面显示的DataFrame, 我的原始数据显示在“数据”列中,并且期望的输出显示在其旁边。如果“数据”中的数字小于2.5,则所需的输出为False。 我可以应用循环并重新构建DataFrame …但是那是“非Python的” 问题答案: 只需将列与该值进行比较:
我的数据如下所示: 内部数组的长度始终相同。键1、键2、键3也始终相同。 我想将其转换为熊猫DataFrame,其中outer_key1,outer_key2,...是索引,key1,key2,key3是列。 编辑: 数据中存在一个问题,我认为这就是给定解决方案不起作用的原因。在少数情况下,内部数组中有三个s,而不是三个字典。这样地:
问题内容: 我有以下DataFrame: 我想增加一列是列的总和,和。 在各个论坛上,我认为这样会起作用: 但事实并非如此。 我想知道适当的操作与列的列表和作为输入。 问题答案: 您可以设置参数以对行求和,这将不忽略任何数字列: 如果您只想汇总特定的列,则可以创建列的列表并删除您不感兴趣的列: