我有一只来自熊猫的 DataFrame
:
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
输出:
c1 c2
0 10 100
1 11 110
2 12 120
现在我想迭代这个帧的行 . 对于每一行,我希望能够通过列的名称访问其元素(单元格中的值) . 例如:
for row in df.rows:
print row['c1'], row['c2']
是不是可以在熊猫中做到这一点?
我找到了similar question . 但它没有给我我需要的答案 . 例如,建议使用:
for date, row in df.T.iteritems():
要么
for row in df.iterrows():
但我不明白 row
对象是什么以及如何使用它 .
14 回答
恕我直言,最简单的决定
虽然
iterrows()
是一个不错的选择,但有时itertuples()
可以更快:我在找 How to iterate on rows AND columns and ended here so :
要在pandas中迭代DataFrame的行,可以使用:
itertuples()
应该比iterrows()
更快但请注意,根据文档(目前的pandas 0.21.1):
dtype
可能在行与行之间不匹配改为使用DataFrame.apply():
使用itertuples() . 它比iterrows()更快:
你可以编写自己的迭代器来实现
namedtuple
这与
pd.DataFrame.itertuples
直接相当 . 我的目标是以更高的效率执行相同的任务 .对于具有我的函数的给定数据帧:
或者使用
pd.DataFrame.itertuples
:A comprehensive test
我们测试使所有列可用并对列进行子集化 .
iterrows是一个生成索引和行的生成器
您还可以进行
numpy
索引以获得更高的速度 . 对于某些应用程序来说,它并不是真正的迭代,而是比迭代更好 .您可能还想将其强制转换为数组 . 这些索引/选择应该像Numpy数组一样,但我遇到了问题,需要进行转换
您还可以使用
df.apply()
迭代行并访问函数的多个列 .docs: DataFrame.apply()
除了上面的答案,有时一个有用的模式是:
结果如下:
要循环
dataframe
中的所有行,您可以使用:为什么复杂的事情?
简单 .
您可以使用df.iloc函数,如下所示:
要循环 conveniently 的
dataframe
和 use 值中的所有行,namedtuples
可以转换为ndarray
s . 例如:迭代行:
结果是:
请注意,如果
index=True
, the index is added as the first element of the tuple ,这可能是某些应用程序所不希望的 .