【问题标题】:iterate over pandas dataframe using itertuples使用 itertuples 遍历 pandas 数据框
【发布时间】:2017-08-30 11:29:29
【问题描述】:

我正在使用 itertuples 对 pandas 数据框进行迭代。我还想在迭代时捕获行号:

for row in df.itertuples():
    print row['name']

预期输出:

1 larry
2 barry
3 michael

1、2、3 是行号。我想避免使用计数器并获取行号。有没有使用 pandas 实现此目的的简单方法?

【问题讨论】:

  • 拒绝使用enumerate - Python 中针对这些情况的常见模式 - 似乎很奇怪。我会用它。否则df.reset_index() 将带来一个基于 0 的索引,因此行号将是您为给定行 +1 迭代的索引
  • 你应该像in this SO post一样使用iterrows
  • @Boud 哪里说他们拒绝使用枚举?
  • @Cheng iterrows 的问题是 dtypes 可能无法跨行保持一致。这可能会带来很大的问题。

标签: python pandas


【解决方案1】:

使用itertuples 时,每行都会有一个名为tuple。默认情况下,您可以使用row.Index 访问该行的索引值。

如果索引值不是您想要的,那么您可以使用enumerate

for i, row in enumerate(df.itertuples(), 1):
    print(i, row.name)

enumerate 代替了丑陋的计数器结构

【讨论】:

  • 计数器为什么丑?
  • 非常难看 for(int i=0; i
【解决方案2】:
for row in df.itertuples():
    print(getattr(row, 'Index'), getattr(row, 'name'))

【讨论】:

  • 您的答案可能是正确的,但解释会对其他读者有所帮助。欲了解更多信息,请阅读stackoverflow.com/help/how-to-answer
  • 为什么要getattr?只需使用row.Index,row.name
【解决方案3】:

对于不是有效 Python 名称的列名,请使用:

for i, row in enumerate(df.itertuples(index=False)):
    print(str(i) + row[df.columns.get_loc('My nasty - column / name')])

如果不指定index=False,则会读取命名前的列。

【讨论】:

  • 反对票有什么原因吗?不介意,只是好奇。已添加枚举,以防万一。
  • 我认为命名元组不允许字符串访问器。
  • 不确定我是否错过了约翰的观点,但这是成功解决我的问题的有效代码。 get_loc 返回列的索引,而不是字符串。
  • 你说得对,我一定是抄错了。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2016-04-25
  • 2022-01-20
相关资源
最近更新 更多