Cara yang tepat untuk membalikkan pandas.DataFrame?

117

Ini kode saya:

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

Ketika saya menjalankan kode ini, saya mendapatkan kesalahan berikut:

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'

Mengapa saya mendapatkan kesalahan ini?
Bagaimana cara memperbaikinya?
Apa cara yang benar untuk membalikkan pandas.DataFrame?

Michael
sumber
3
Output apa yang Anda cari? "One"bukan kolom data, dan saya tidak tahu apakah Twoitu variabel atau kesalahan ketik "Two", yang juga bukan kolom. Apakah Anda hanya ingin membalik urutan kolom?
DSM
Apakah maksud Anda data[["Odd", "Even"]], atau lebih umum data[data.columns[::-1]],?
Fred Foo
1
Anda masih belum memberikan contoh keluaran yang Anda inginkan. Saya tahu bagaimana menyiasati fakta reversed(data)tidak berhasil, tetapi saya tidak tahu mengapa Anda ingin mencetak keseluruhan Odddan Evenkolom sekali untuk setiap kolom dalam bingkai, yang akan dilakukan kode Anda jika Anda menggunakannya reversed(list(data)).
DSM
Saya ingin memulai loop dari akhir dataFrame saya
Michael
2
Maka saya pikir pertanyaan Anda adalah duplikat dari yang ini , dan Anda menginginkan sesuatu seperti for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Harap selalu memberikan contoh dalam pertanyaan Anda tentang keluaran yang Anda harapkan; itu membuat hidup lebih mudah bagi semua orang.
DSM

Jawaban:

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

atau sederhana:

data.iloc[::-1]

akan membalikkan bingkai data Anda, jika Anda ingin memiliki forperulangan yang bergerak dari bawah ke atas, Anda dapat melakukan:

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

atau

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

Anda mendapatkan kesalahan karena reversedpanggilan pertama data.__len__()yang mengembalikan 6. Kemudian ia mencoba untuk memanggil data[j - 1]untuk jdi range(6, 0, -1), dan panggilan pertama akan data[5]; tapi di pandas dataframe data[5]berarti kolom 5, dan tidak ada kolom 5 jadi akan ada pengecualian. (lihat dokumen )

behzad.nouri
sumber
jika Anda mengalami masalah, Anda dapat mencoba ini:for index, row in df.iloc[::-1].iterrows():
kristian
ada cara untuk melakukannya di tempat ? ekuivalen dengan hipotetisdata.reindex(index=data.index[::-1], inplace=True)
NeuronQ
3
Dapat melakukan data = data.reindex(index=data.index[::-1])kemudian data.reset_index(inplace=True, drop=True)dan itu akan menjadi ulang di tempat.
Matts
4
Apakah df = df[::-1]larutan pythonic dan valid?
tommy.carstensen
@ tommy.carstensen ya, dan itu harus menjadi jawaban teratas
rosstripi
65

Anda dapat membalikkan baris dengan cara yang lebih sederhana:

df[::-1]
pengguna1951
sumber
3
Saya suka mendefinisikan reverse()metode saya sendiri dengan pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]karena terlihat lebih bagus saat merangkai metode, mis df.reverse().iterrows().
Ben Mares
5

Tak satu pun dari jawaban yang ada menyetel ulang indeks setelah membalik kerangka data.

Untuk ini, lakukan hal berikut:

 data[::-1].reset_index()

Berikut adalah fungsi utilitas yang juga menghapus kolom indeks lama, sesuai komentar @ Tim:

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

Cukup berikan kerangka data Anda ke dalam fungsi

Berhubung dgn sibernetika
sumber
1
Anda mungkin ingin memilikinya drop=True, yaitu data[::-1].reset_index(drop=True):, jika tidak indeks lama akan ditambahkan sebagai kolom pada DataFrame.
Tim
Mengapa Anda ingin melakukan ini?
endolith
@endolith Beberapa perpustakaan mengharapkan bingkai data diindeks. Misalnya, beberapa pustaka perkiraan deret waktu mengharapkan bingkai yang diindeks sebagai masukan sehingga dapat memodelkan deret waktu sambil tetap agnostik ke langkah waktu (hari, bulan, tahun, dll.). Jadi Anda mungkin bekerja dengan bingkai data, melakukan transformasi padanya, yang mengacaukan pengindeksan. Sangat umum untuk mengindeks ulang bingkai.
Cybernetic
1

Ini bekerja:

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