Python – 如何迭代Pandas中的DataFrame中的行?

我有一只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是一个生成索引和行的生成器

import pandas as pd
import numpy as np

df = pd.DataFrame([{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}])
for index, row in df.iterrows():
    print(row['c1'], row['c2'])

Output: 
   10 100
   11 110
   12 120

首先考虑一下你是否真的需要迭代 DataFrame中的行。请参阅此答案了解替代方案

如果仍需要迭代行,可以使用下面的方法。请注意一些 重要的警告,这些警告在任何其他答案中都没有提到。

itertuples() 应该比…更快 iterrows()

但请注意,根据文档(目前大熊猫0.24.2):

  • iterrows:dtype可能在行与行之间不匹配

    因为iterrows为每一行返回一个Series,所以它不会保留行中的dtypes(dtypes保留在DataFrames的列之间)。为了在迭代行时保留dtypes,最好使用itertuples()返回值的namedtuples,它通常比iterrows()快得多

  • iterrows:不要修改行

    永远不应该修改你正在迭代的东西。这并不能保证在所有情况下都有效。根据数据类型,迭代器返回副本而不是视图,并且写入它将不起作用。

    请改用DataFrame.apply()

    new_df = df.apply(lambda x: x * 2)
  • itertuples:

    如果列名称是无效的Python标识符,重复或以下划线开头,则列名称将重命名为位置名称。使用大量列(> 255)时,将返回常规元组。

有关更多详细信息,请参阅迭代上的pandas文档


你应该用df.iterrows()。虽然逐行迭代不是特别有效,因为必须创建Series对象。


140

虽然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

添加评论

友情链接:蝴蝶教程