为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Pandas中遍历DataFrame中的行?

如何在Pandas中遍历DataFrame中的行?

回首忆惘然 2019-06-06 13:25:43
如何在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   c20  10  1001  11  1102  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对象,以及我如何处理它。
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

首先要考虑你是否真的需要迭代在DataFrame中的行。看见这个答案寻找其他选择。

如果仍然需要对行进行迭代,则可以使用下面的方法。注意一些重要注意事项在其他任何答案中都没有提到。

  • DataFrame.iterrow()

    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.24.2):

  • 迭代:dtype可能不匹配每一行。

    因为迭代行为每一行返回一个序列,所以不保存跨行的dtype(数据框架的跨列保留dtype)。要在对行进行迭代时保留dtype,最好使用itertuples(),它返回值的namedtuple,并且通常比iterrow()快得多。

  • 迭代行:不要修改行

    你应该永远不要修改你正在迭代的东西。这并不能保证在所有情况下都能奏效。根据数据类型的不同,迭代器返回一个副本,而不是一个视图,对其进行写入将没有任何效果。

    使用DataFrame.Apply()相反:

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

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

看见熊猫的迭代文档更多细节。


查看完整回答
反对 回复 2019-06-06
?
慕码人8056858

TA贡献1803条经验 获得超6个赞


当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


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 2295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信