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对象是什么以及如何使用它。


iterrows是一个产生索引和行的生成器

for index, row in df.iterrows():
   print row['c1'], row['c2']

Output: 
   10 100
   11 110
   12 120

要在pandas中迭代DataFrame的行,可以使用:

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

添加评论

友情链接:蝴蝶教程