Cách đúng để đảo ngược gấu trúc.DataFrame?


117

Đây là mã của tôi:

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

Khi tôi chạy mã này, tôi gặp lỗi sau:

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'

Tại sao tôi nhận được lỗi này?
Lam sao tôi co thể sửa no?
Cách đúng để đảo ngược là pandas.DataFramegì?


3
Đầu ra bạn đang tìm kiếm là gì? "One"không phải là một cột trong datavà tôi không biết đó Twolà một biến hay một lỗi đánh máy cho "Two", cũng không phải là một cột. Bạn chỉ muốn đảo ngược thứ tự cột?
DSM

Ý bạn là data[["Odd", "Even"]], hay nói chung là data[data.columns[::-1]],?
Fred Foo

1
Bạn vẫn chưa đưa ra một ví dụ về đầu ra mà bạn muốn. Tôi biết cách giải quyết vấn đề reversed(data)không hiệu quả, nhưng tôi không biết tại sao bạn lại muốn in toàn bộ OddEvencác cột một lần cho mỗi cột trong khung, đó là những gì mã của bạn sẽ làm nếu bạn sử dụng reversed(list(data)).
DSM

Tôi muốn bắt đầu vòng lặp for từ cuối dataFrame của mình
Michael

2
Sau đó, tôi nghĩ câu hỏi của bạn trùng lặp với câu hỏi này , và bạn muốn một cái gì đó như thế for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Hãy luôn đưa ra các ví dụ trong câu hỏi của bạn về kết quả đầu ra mà bạn mong đợi; nó làm cho cuộc sống của mọi người dễ dàng hơn nhiều.
DSM

Câu trả lời:


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

hoặc đơn giản:

data.iloc[::-1]

sẽ đảo ngược khung dữ liệu của bạn, nếu bạn muốn có một forvòng lặp đi từ dưới lên, bạn có thể thực hiện:

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

hoặc là

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

Bạn đang nhận được một lỗi bởi vì reversedcác cuộc gọi đầu tiên data.__len__()mà trả 6. Sau đó, nó cố gắng gọi data[j - 1]cho jtrong range(6, 0, -1), và các cuộc gọi đầu tiên sẽ là data[5]; nhưng trong khung dữ liệu gấu trúc data[5]có nghĩa là cột 5, và không có cột 5 nên nó sẽ ném ra một ngoại lệ. (xem tài liệu )


nếu bạn đang gặp vấn đề, bạn có thể thử cái này:for index, row in df.iloc[::-1].iterrows():
kristian

bất kỳ cách nào để làm điều đó tại chỗ ? tương đương với giả thuyếtdata.reindex(index=data.index[::-1], inplace=True)
NeuronQ

3
Có thể làm data = data.reindex(index=data.index[::-1])sau đó data.reset_index(inplace=True, drop=True)và nó sẽ được đặt lại tại chỗ.
Matts

4
df = df[::-1]một giải pháp pythonic và hợp lệ?
tommy.carstensen

@ tommy.carstensen có, và nó sẽ là câu trả lời đầu
rosstripi

65

Bạn có thể đảo ngược các hàng theo cách đơn giản hơn:

df[::-1]

3
Tôi thích xác định reverse()phương thức của riêng mình với pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]vì nó trông đẹp hơn khi chuỗi các phương thức, ví dụ df.reverse().iterrows().
Ben Mares

5

Không có câu trả lời hiện có nào đặt lại chỉ mục sau khi đảo ngược khung dữ liệu.

Đối với điều này, hãy làm như sau:

 data[::-1].reset_index()

Đây là một chức năng tiện ích cũng loại bỏ cột chỉ mục cũ, theo nhận xét của @ Tim:

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

Đơn giản chỉ cần chuyển khung dữ liệu của bạn vào hàm


1
Bạn có thể muốn có drop=True, tức là data[::-1].reset_index(drop=True):, nếu không chỉ mục cũ sẽ được thêm vào dưới dạng một cột trên DataFrame.
Tim

Tại sao bạn muốn làm điều này?
endolith

@endolith Một số thư viện mong muốn khung dữ liệu được lập chỉ mục. Ví dụ: một số thư viện dự báo chuỗi thời gian mong đợi một khung được lập chỉ mục làm đầu vào để nó có thể lập mô hình chuỗi thời gian trong khi vẫn không xác định được bước thời gian (ngày, tháng, năm, v.v.). Vì vậy, bạn có thể đang làm việc với một khung dữ liệu, thực hiện một chuyển đổi trên nó, điều này làm rối tung việc lập chỉ mục. Do đó, việc lập chỉ mục lại khung là điều phổ biến.
Cybernetic

1

Những công việc này:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.