如何迭代Pandas中的DataFrame中的行?
我有熊猫的DataFrames:
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
对象是什么,以及我如何使用它。
iterrows是一个产生索引和行的发生器
In [18]: for index, row in df.iterrows():
....: print row['c1'], row['c2']
....:
10 100
11 110
12 120
虽然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
要遍历熊猫中的DataFrame行,可以使用:
DataFrame.iterrows()
for index, row in df.iterrows():
print row["c1"], row["c2"]
DataFrame.itertuples()
for row in df.itertuples(index=True, name='Pandas'):
print getattr(row, "c1"), getattr(row, "c2")
itertuples()
应该比iterrows()
更快,
但请注意,根据文档(目前熊猫0.21.1):
iterrows: dtype
可能不会从行匹配行
由于iterrows为每行返回一个Series,因此它不会保留行之间的dtypes(DataFrames的列之间保留dtypes)。
iterrows:不要修改行
你不应该修改你正在迭代的东西。 这并不能保证在所有情况下都能正常工作。 根据数据类型的不同,迭代器会返回一个副本而不是视图,写入它将不起作用。
使用DataFrame.apply()来代替:
new_df = df.apply(lambda x: x * 2)
itertuples:
如果列名是无效的Python标识符,重复或以下划线开头,那么列名将被重命名为位置名。 对于大量的列(> 255),返回常规元组。
上一篇: How to iterate over rows in a DataFrame in Pandas?
下一篇: Adding new column to existing DataFrame in Python pandas