从Pandas中的iterrows()获取行位置而不是行索引

时间:2018-05-23 09:52:54

标签: python python-3.x pandas for-loop

我是stackoverflow的新手,我有研究但没有找到令人满意的答案。

据我所知,我可以通过使用df.iterrows()来迭代df来获取行索引。但是,如果我想获得行位置而不是行idx,该怎么办?我可以使用什么方法?

我正在处理的示例代码如下:

df = pd.DataFrame({'month': ['Jan', 'Feb', 'March', 'April'],
               'year': [2012, 2014, 2013, 2014],
               'sale':[55, 40, 84, 31]})

df = df.set_index('month')

for idx, value in df.iterrows():
    print(idx)

如何获得输出:

0
1
2
3

谢谢!

4 个答案:

答案 0 :(得分:3)

只需使用enumerate

for idx, (_, value) in enumerate(df.iterrows()):
    print(idx)

答案 1 :(得分:2)

如果您需要行号而不是索引,则应该:

  1. 在循环中使用enumerate作为计数器。
  2. 请勿提取索引,请参阅以下选项。
  3. 选项1

    在大多数情况下,出于性能原因,您应该尝试使用df.itertuples代替df.iterrows。您可以指定index=False,以便第一个元素不是索引。

    for idx, row in enumerate(df.itertuples(index=False)):
        # do something
    

    df.itertuples为每一行返回一个namedtuple。

    选项2

    使用df.iterrows。这更麻烦,因为您需要分离出一个未使用的变量。此外,这与itertuples相比效率低。

    for idx, (_, row) in enumerate(df.iterrows()):
        # do something
    

答案 2 :(得分:1)

您可以在df.index:

上使用get_loc
for idx, value in df.iterrows():
    print(idx, df.index.get_loc(idx))

输出:

Jan 0
Feb 1
March 2
April 3

答案 3 :(得分:0)

您可以使用df.index()返回一系列索引编号。返回的值是RangeIndex对象,它是一个range类似的可迭代,支持迭代和Pandas系列支持的许多其他功能:

>>> df.index
RangeIndex(start=0, stop=4, step=1)
>>> 
>>> list(df.index)
[0, 1, 2, 3]