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
?
"One"
bukan kolomdata
, dan saya tidak tahu apakahTwo
itu variabel atau kesalahan ketik"Two"
, yang juga bukan kolom. Apakah Anda hanya ingin membalik urutan kolom?data[["Odd", "Even"]]
, atau lebih umumdata[data.columns[::-1]]
,?reversed(data)
tidak berhasil, tetapi saya tidak tahu mengapa Anda ingin mencetak keseluruhanOdd
danEven
kolom sekali untuk setiap kolom dalam bingkai, yang akan dilakukan kode Anda jika Anda menggunakannyareversed(list(data))
.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.Jawaban:
atau sederhana:
akan membalikkan bingkai data Anda, jika Anda ingin memiliki
for
perulangan yang bergerak dari bawah ke atas, Anda dapat melakukan:atau
Anda mendapatkan kesalahan karena
reversed
panggilan pertamadata.__len__()
yang mengembalikan 6. Kemudian ia mencoba untuk memanggildata[j - 1]
untukj
dirange(6, 0, -1)
, dan panggilan pertama akandata[5]
; tapi di pandas dataframedata[5]
berarti kolom 5, dan tidak ada kolom 5 jadi akan ada pengecualian. (lihat dokumen )sumber
for index, row in df.iloc[::-1].iterrows():
data.reindex(index=data.index[::-1], inplace=True)
data = data.reindex(index=data.index[::-1])
kemudiandata.reset_index(inplace=True, drop=True)
dan itu akan menjadi ulang di tempat.df = df[::-1]
larutan pythonic dan valid?Anda dapat membalikkan baris dengan cara yang lebih sederhana:
sumber
reverse()
metode saya sendiri denganpd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]
karena terlihat lebih bagus saat merangkai metode, misdf.reverse().iterrows()
.Tak satu pun dari jawaban yang ada menyetel ulang indeks setelah membalik kerangka data.
Untuk ini, lakukan hal berikut:
Berikut adalah fungsi utilitas yang juga menghapus kolom indeks lama, sesuai komentar @ Tim:
Cukup berikan kerangka data Anda ke dalam fungsi
sumber
drop=True
, yaitudata[::-1].reset_index(drop=True)
:, jika tidak indeks lama akan ditambahkan sebagai kolom pada DataFrame.Ini bekerja:
sumber