我有一个来自 pandas 的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']
是否有可能在熊猫中做到这一点?
我发现了类似的问题 。但它没有给我我需要的答案。例如,建议使用:
for date, row in df.T.iteritems():
要么
for row in df.iterrows():
但我不明白row
对象是什么以及如何使用它。
DataFrame.iterrows是一个生成索引和行的生成器
for index, row in df.iterrows():
print(row['c1'], row['c2'])
Output:
10 100
11 110
12 120
要在 pandas 中迭代 DataFrame 的行,可以使用:
for index, row in df.iterrows():
print row["c1"], row["c2"]
for row in df.itertuples(index=True, name='Pandas'):
print getattr(row, "c1"), getattr(row, "c2")
itertuples()
应该比iterrows()
更快
但请注意,根据文档(目前的 pandas 0.21.1):
iterrows: dtype
可能不会从行匹配行
因为 iterrows 为每一行返回一个 Series,所以它不会保留行中的 dtypes(dtypes 保留在 DataFrames 的列之间)。
iterrows:不要修改行
你永远不应该修改你正在迭代的东西。这并不能保证在所有情况下都有效。根据数据类型,迭代器返回副本而不是视图,并且写入它将不起作用。
请改用DataFrame.apply() :
new_df = df.apply(lambda x: x * 2)
itertuples:
如果列名称是无效的 Python 标识符,重复或以下划线开头,则列名称将重命名为位置名称。使用大量列(> 255)时,将返回常规元组。
虽然iterrows()
是一个不错的选择,但有时itertuples()
可以更快:
df = pd.DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'})
%timeit [row.a * 2 for idx, row in df.iterrows()]
# => 10 loops, best of 3: 50.3 ms per loop
%timeit [row[1] * 2 for row in df.itertuples()]
# => 1000 loops, best of 3: 541 µs per loop