Pandaları tersine çevirmenin doğru yolu.DataFrame?


117

İşte kodum:

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

Bu kodu çalıştırdığımda şu hatayı alıyorum:

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'

Neden bu hatayı alıyorum?
Bunu nasıl düzeltebilirim?
Tersine çevirmenin doğru yolu nedir pandas.DataFrame?


3
Hangi çıktıyı arıyorsunuz? "One"bir sütun değil ve bir sütun datadeğil Two, değişken mi yoksa yazım hatası mı bilmiyorum "Two". Sadece sütun sırasını tersine mi çevirmek istiyorsunuz?
DSM

data[["Odd", "Even"]]Daha genel olarak mı demek istediniz data[data.columns[::-1]]?
Fred Foo

1
Hala istediğiniz çıktıya bir örnek vermediniz. Bu gerçeği nasıl aşacağımı biliyorum reversed(data), ancak çerçevedeki her sütun için bütünü Oddve Evensütunları neden bir kez yazdırmak isteyeceğinizi bilmiyorum , kodunuz kullanırsanız bunu yapardı reversed(list(data)).
DSM

For döngüsünü dataFrame'in sonundan başlatmak istiyorum
Michael

2
Sonra Sorunuzu bir dup olduğunu düşünüyorum bu bir ve aşağıdakilere benzer bir şey istiyorum for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Lütfen her zaman sorunuzda beklediğiniz çıktıyla ilgili örnekler verin; hayatı herkes için çok daha kolaylaştırır.
DSM

Yanıtlar:


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

ya da sadece:

data.iloc[::-1]

veri çerçevenizi tersine çevirir, foraşağıdan yukarıya giden bir döngü olmasını istiyorsanız şunları yapabilirsiniz:

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

veya

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

Çünkü Hatayla reversedilk çağrılar data.__len__()6. döndürür Sonra aramaya çalıştığında data[j - 1]için jde range(6, 0, -1)ve ilk çağrı olacaktır data[5]; ancak pandalar veri çerçevesinde data[5]sütun 5 anlamına gelir ve sütun 5 olmadığı için bir istisna atar. ( belgelere bakın )


Eğer sorun yaşıyorsanız şunu deneyebilirsiniz:for index, row in df.iloc[::-1].iterrows():
kristian

yerinde yapmanın bir yolu var mı? varsayımsal eşdeğerdata.reindex(index=data.index[::-1], inplace=True)
NeuronQ

3
O data = data.reindex(index=data.index[::-1])zaman yapabilir data.reset_index(inplace=True, drop=True)ve yerine sıfırlanacaktır.
Matts

4
df = df[::-1]pythonic ve geçerli çözüm?
tommy.carstensen

@ tommy.carstensen evet, ve en iyi cevap bu olmalı
rosstripi

66

Satırları daha da basit bir şekilde tersine çevirebilirsiniz:

df[::-1]

4
Yöntemleri zincirlerken daha güzel göründüğü için kendi reverse()yöntemimi tanımlamayı seviyorum pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1], örneğin df.reverse().iterrows().
Ben Mares

5

Mevcut yanıtların hiçbiri, veri çerçevesini ters çevirdikten sonra dizini sıfırlamaz.

Bunun için aşağıdakileri yapın:

 data[::-1].reset_index()

@ Tim'in yorumuna göre eski dizin sütununu da kaldıran bir yardımcı program işlevi :

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

Veri çerçevenizi işleve aktarmanız yeterlidir


1
Muhtemelen sahip olmak istiyorsunuz drop=True, yani:, data[::-1].reset_index(drop=True)aksi takdirde eski dizin DataFrame'e bir sütun olarak eklenecektir.
Tim

Bunu neden yapmak istersiniz?
endolith

1
@endolith Bazı kütüphaneler veri çerçevesinin indekslenmesini bekler. Örneğin, bazı zaman serisi tahmin kitaplıkları girdi olarak indekslenmiş bir çerçeve bekler, böylece zaman adımından (gün, ay, yıl vb.) Bağımsız kalırken bir zaman serisini modelleyebilir. Dolayısıyla, bir veri çerçevesiyle çalışıyor olabilirsiniz, üzerinde bir dönüşüm yapın, bu da indekslemeyi bozar. Çerçeveyi bu şekilde yeniden dizine eklemek yaygındır.
Sibernetik

1

Bu çalışıyor:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.