使用 itertuples 遍历 pandas 数据框

Posted

技术标签:

【中文标题】使用 itertuples 遍历 pandas 数据框【英文标题】:iterate over pandas dataframe using itertuples 【发布时间】: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 哪里说他们拒绝使用枚举? 这能回答你的问题吗? What is the most efficient way to loop through dataframes with pandas? @Cheng iterrows 的问题是 dtypes 可能无法跨行保持一致。这可能会带来很大的问题。 【参考方案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'))

【讨论】:

您的答案可能是正确的,但解释会对其他读者有所帮助。欲了解更多信息,请阅读***.com/help/how-to-answer 为什么要getattr?只需使用row.Indexrow.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 返回列的索引,而不是字符串。 你说得对,我一定是抄错了。感谢您的澄清!

以上是关于使用 itertuples 遍历 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

Pandas中DataFrame的学习笔记~

Pandas中DataFrame的学习笔记~

Pandas - 使用 itertuples 创建列

ValueError:在 Pandas 数据帧上使用 itertuples() 时解包的值太多

Pandas df.itertuples 在打印时重命名数据框列

pandas使用itertuples函数迭代dataframe中的数据行并自定义修改行中的数值(update row while iterating over the rows)