2015-02-26 22 views
10

Powiedzmy, że df to pandasowa ramka danych.Indeksowanie ramek danych Pandy: wiersze całkowite, kolumny o nazwach

  • df.loc[] akceptuje tylko nazwy
  • df.iloc[] przyjmuje tylko liczby całkowite (faktyczne miejsca docelowe)
  • df.ix[] akceptuje oba nazwiska i liczby całkowite:

Po przedstawieniu wierszy, df.ix[row_idx, ] tylko chce być podane nazwiska. na przykład

df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'], 
        '1' : np.arange(6)}) 
df = df.ix[2:6] 
print(df) 

    1  a 
2 2 three 
3 3 four 
4 4 five 
5 5 six 

df.ix[0, 'a'] 

podaje błąd, nie zwraca "dwóch".

Podczas tworzenia odwołania do kolumn iloc preferuje liczby całkowite, a nie nazwy. na przykład

df.ix[2, 1] 

zwroty 'trzy', a nie 2. (chociaż df.idx[2, '1'] nie powraca 2).

Dziwnie, chciałbym dokładnie odwrotnej funkcjonalności. Zwykle moje nazwy kolumn są bardzo znaczące, więc w moim kodzie odwołuję się do nich bezpośrednio. Ale z powodu dużej ilości obserwacji, nazwy rzędów w ramkach danych moich pand nie zwykle odpowiadają range(len(df)).

Zdaję sobie sprawę, mogę użyć:

df.iloc[0].loc['a'] # returns three 

Ale wydaje się brzydki! Czy ktoś wie o lepszy sposób to zrobić, aby kod wyglądał tak?

df.foo[0, 'a'] # returns three 

W rzeczywistości, jest to możliwe, aby dodać na własnej nowej metody do pandas.core.frame.DataFrame s, więc na przykład df.idx(rows, cols) jest w rzeczywistości df.iloc[rows].loc[cols]?

+1

Można użyć 'df ['a']. Iloc [0]'. – unutbu

+6

Zobacz także [GH 9213] (https://github.com/pydata/pandas/issues/9213#issuecomment- 72076683), który sugeruje 'df.loc [df.index [0], 'a']'. Ma to tę zaletę (http://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-the-assignment-when-using-chained-indexing-fail) , co oznacza, że ​​będzie działać podczas wykonywania przypisań, podczas gdy 'df [['a', 'b']]. iloc [0] = val' nie będzie. – unutbu

+0

tak naprawdę nie rozwiązuje twojego problemu, ale bardzo dobra odpowiedź tutaj: https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation – JohnE

Odpowiedz

8

To jest późna odpowiedź, ale komentarz @ unutbu jest nadal ważny i jest świetnym rozwiązaniem tego problemu.

do indeksowania DataFrame z całkowitych wierszy i kolumn (oznaczonych nazwanych kolumn):

df.loc[df.index[#], 'NAME'] gdzie # jest ważny wskaźnik całkowitą i NAME to nazwa kolumny.

+0

Wydaje się bardzo wolny na długich ramkach danych. – ConanG

Powiązane problemy