如何在Pandas的iterrows()中获取行位置而非行索引?
获取DataFrame行位置而非自定义索引的方法
嘿,完全懂你的困扰!你把month设成了DataFrame的自定义索引后,iterrows()返回的第一个元素就变成了这个自定义索引值(也就是Jan、Feb这些),但你想要的是从0开始的行位置序号对吧?给你几个简单的解决方案:
方法1:用enumerate()包裹iterrows()
这是最直接的方式,不需要修改原DataFrame,就能同时拿到行位置和原索引、行数据:
df = pd.DataFrame({'month': ['Jan', 'Feb', 'March', 'April'], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) df = df.set_index('month') # 用enumerate获取行位置pos for pos, (idx, value) in enumerate(df.iterrows()): print(pos)
运行后就会输出你想要的:0 1 2 3(每行一个数字)。
方法2:重置索引后使用iterrows()
如果之后你还需要频繁用到默认整数索引,也可以先把索引重置,让默认的0开始的整数索引回来:
df = pd.DataFrame({'month': ['Jan', 'Feb', 'March', 'April'], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) df = df.set_index('month') # 重置索引,默认生成0开始的整数索引 df_reset = df.reset_index() for pos, row in df_reset.iterrows(): print(pos)
这种方式下,pos就是行位置,同时你还能通过row['month']访问原来的自定义索引值。
方法3:用itertuples()配合enumerate()
如果你追求更高的遍历效率(itertuples()比iterrows()更快),也可以这么写:
df = pd.DataFrame({'month': ['Jan', 'Feb', 'March', 'April'], 'year': [2012, 2014, 2013, 2014], 'sale':[55, 40, 84, 31]}) df = df.set_index('month') for pos, row in enumerate(df.itertuples()): print(pos) # 如果需要原索引,可以用row.Index # print(row.Index) # 会输出Jan、Feb等
简单总结一下:你之前的问题是因为自定义索引替换了默认的整数索引,iterrows()返回的是自定义索引而非行位置,用上面的方法就能轻松拿到你要的行序号啦!
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

