如何迭代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),返回常规元组。

  • 链接地址: http://www.djcxy.com/p/12229.html

    上一篇: How to iterate over rows in a DataFrame in Pandas?

    下一篇: Adding new column to existing DataFrame in Python pandas