使用itertuples迭代Pandas数据帧

53

我正在使用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。 - Zeugma
1
你应该像这个StackOverflow 帖子中所示使用 iterrows - Cheng
@Boud 在哪里看到他们拒绝使用enumerate了? - lucid_dreamer
这回答解决了你的问题吗?使用Pandas循环遍历数据框的最有效方法是什么? - Abu Shoeb
2
@Cheng,使用iterrows的问题在于数据类型可能无法在行之间保持一致。这可能会带来很大的问题。 - lb_so
3个回答

75

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

如果索引值不是您要查找的内容,则可以使用enumerate

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

enumerate 取代了一个丑陋的计数器结构


8
计数器为什么那么丑? - lucid_dreamer
5
使用“for循环”而不是“枚举”可能会让代码看起来比较丑陋。原始代码为: "very ugly for(int i=0; i<= arr.length. ; I++) instead of enumrate" - Tal Avissar

35
for row in df.itertuples():
    print(getattr(row, 'Index'), getattr(row, 'name'))

17
你的回答可能是正确的,但是解释会帮助其他读者更好地理解。如需了解更多信息,请阅读https://stackoverflow.com/help/how-to-answer。 - Mikkel
10
为什么要使用getattr?直接使用row.Indexrow.name不就可以了吗? - nurettin
如果列名是动态合成的,则getattr函数非常适用,因为它允许使用字符串。 - Walter Kelt

12

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

for i, row in enumerate(df.itertuples(index=False)):
    print(str(i) + row[df.columns.get_loc('My nasty - column / name')])
如果您没有指定index=False,则将读取该列之前的列。

有什么原因导致了这些负评吗?我并不在意,只是好奇。我已经添加了enumerate,以防万一。 - Chris
1
我认为命名元组不允许使用字符串访问器。 - John Haberstroh
1
不确定我是否理解你的意思,John,但这是有效解决了我的问题的工作代码。get_loc返回列的索引,而不是字符串。 - Chris
你说得对,我一定是复制错了。感谢澄清! - John Haberstroh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接