这是我的代码:

import pandas as pd

data = pd.DataFrame({'Odd':[1,3,5,6,7,9], 'Even':[0,2,4,6,8,10]})

for i in reversed(data):
    print(data['Odd'], data['Even'])

当我运行这段代码时,我得到以下错误:

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 665, in _get_item_cache
    return cache[item]
KeyError: 5

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\*****\Documents\******\********\****.py", line 5, in <module>
    for i in reversed(data):
  File "C:\Python33\lib\site-packages\pandas\core\frame.py", line 2003, in __getitem__
    return self._get_item_cache(key)
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 667, in _get_item_cache
    values = self._data.get(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1656, in get
    _, block = self._find_block(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1936, in _find_block
    self._check_have(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1943, in _check_have
    raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: 'no item named 5'

为什么我得到这个错误? 我该怎么解决呢? 什么是反转pandas.DataFrame的正确方法?


当前回答

data.reindex(index=data.index[::-1])

或者仅仅是:

data.iloc[::-1]

将反转你的数据帧,如果你想有一个从下到上的for循环,你可以这样做:

for idx in reversed(data.index):
    print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])

or

for idx in reversed(data.index):
    print(idx, data.Even[idx], data.Odd[idx])

你会得到一个错误,因为reversed首先调用data.__len__()返回6。然后它尝试为范围(6,0,-1)中的j调用数据[j -1],并且第一次调用将是数据[5];但是在pandas dataframe中,数据[5]表示第5列,而没有第5列,所以它会抛出异常。(见文档)

其他回答

data.reindex(index=data.index[::-1])

或者仅仅是:

data.iloc[::-1]

将反转你的数据帧,如果你想有一个从下到上的for循环,你可以这样做:

for idx in reversed(data.index):
    print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])

or

for idx in reversed(data.index):
    print(idx, data.Even[idx], data.Odd[idx])

你会得到一个错误,因为reversed首先调用data.__len__()返回6。然后它尝试为范围(6,0,-1)中的j调用数据[j -1],并且第一次调用将是数据[5];但是在pandas dataframe中,数据[5]表示第5列,而没有第5列,所以它会抛出异常。(见文档)

你可以用一种更简单的方式来反转行:

df[::-1]

如果处理排序的范围索引,一种方法是:

data = data.sort_index(ascending=False)

这种方法的优点是:(1)是单行,(2)不需要效用函数,最重要的是(3)不实际改变数据框架中的任何数据。

注意:这是通过索引降序排序来实现的,因此对于任何给定的Dataframe可能并不总是合适或泛化的。

如此:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])

所有现有的答案都不会在反转数据帧后重置索引。

为此,请执行以下步骤:

 data[::-1].reset_index()

下面是一个实用函数,它也删除了旧的索引列,就像@Tim的评论一样:

def reset_my_index(df):
  res = df[::-1].reset_index(drop=True)
  return(res)

简单地将你的数据帧传递给函数