正确的方法来反转pandas.DataFrame?


117

这是我的代码:

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什么?


3
您在寻找什么输出? "One"不是中的列data,而且我也不知道Two是的变量还是错字"Two",这也不是列。您是否只是想反转列顺序?
DSM 2013年

您是说data[["Odd", "Even"]]或更普遍地说data[data.columns[::-1]]吗?
福雷

1
您仍然没有给出所需输出的示例。我知道如何解决这个事实reversed(data)是行不通的,但是我不知道为什么您要为框架中的每一列打印一次整个列OddEven列,如果您使用,代码将执行此操作reversed(list(data))
DSM

我想开始从我的数据框的端部线圈
迈克尔

2
然后我认为您的问题是这个问题的重复,而您想要这样的事情for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]。请始终在问题示例中给出您期望的输出;它使每个人的生活更加轻松。
DSM

Answers:


246
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'])

要么

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

因为你得到一个错误reversed首先调用data.__len__()返回6,然后试图调用data[j - 1]用于jrange(6, 0, -1)和第一个电话会data[5]; 但在pandas数据框中data[5]表示第5列,没有第5列,因此它将引发异常。(请参阅文档


如果您有问题,可以尝试以下方法:for index, row in df.iloc[::-1].iterrows():
kristian 2016年

任何方式做到这一点的地方?等效的假设data.reindex(index=data.index[::-1], inplace=True)
NeuronQ

3
data = data.reindex(index=data.index[::-1])然后可以这样做data.reset_index(inplace=True, drop=True),它将被重置到位。
马特斯(Matts)

4
df = df[::-1]pythonic有效的解决方案吗?
tommy.carstensen 18-10-6

@ tommy.carstensen是的,应该是最佳答案
rosstripi

65

您可以以更简单的方式反转行:

df[::-1]

3
我喜欢定义自己的reverse()方法,pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]因为在链接方法(例如)时看起来更好df.reverse().iterrows()
Ben Mares

5

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

为此,请执行以下操作:

 data[::-1].reset_index()

这是一个实用程序函数,它也按照@Tim的注释删除了旧的索引列:

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

只需将数据框传递给函数


1
您可能希望拥有drop=True,即:data[::-1].reset_index(drop=True),否则旧索引将作为一列添加到DataFrame上。
Tim

你为什么想做这个?
endolith

@endolith一些库希望对数据帧进行索引。例如,某些时间序列预测库希望将索引帧作为输入,以便它可以在不知道时间步长(天,月,年等)的情况下对时间序列建模。因此,您可能正在使用数据框,对其进行转换,从而使索引混乱。因此,重新索引框架是很常见的。
控制论

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.