使用 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.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
返回列的索引,而不是字符串。
你说得对,我一定是抄错了。感谢您的澄清!以上是关于使用 itertuples 遍历 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:在 Pandas 数据帧上使用 itertuples() 时解包的值太多
Pandas df.itertuples 在打印时重命名数据框列
pandas使用itertuples函数迭代dataframe中的数据行并自定义修改行中的数值(update row while iterating over the rows)