协慌网

登录 贡献 社区

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

我有一个来自 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 的行,可以使用:

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