pandas
Logiczne indeksowanie ramek danych
Szukaj…
Wprowadzenie
Dostęp do wierszy w ramce danych za pomocą obiektów indeksujących .ix
, .loc
, .iloc
i tego, jak odróżnia się od używania maski logicznej.
Dostęp do DataFrame z indeksem boolowskim
To będzie nasza przykładowa ramka danych:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Dostęp za pomocą .loc
df.loc[True]
color
True red
True red
Dostęp za pomocą .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Należy zauważyć, że starsze wersje pand nie rozróżniały wartości logicznych od liczb całkowitych, dlatego też
.iloc[True]
zwróci to samo, co.iloc[1]
Dostęp za pomocą .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Jak widać, .ix
ma dwa zachowania. Jest to bardzo zła praktyka w kodzie i dlatego należy jej unikać. Proszę użyć .iloc
lub .loc
aby być bardziej wyraźnym.
Zastosowanie maski logicznej do ramki danych
To będzie nasza przykładowa ramka danych:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Korzystanie z magicznego __getitem__
lub []
akcesorium. Dając mu listę Prawda i Fałsz o tej samej długości co ramka danych, otrzymasz:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Maskowanie danych na podstawie wartości kolumny
To będzie nasza przykładowa ramka danych:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
Uzyskując dostęp do pojedynczej kolumny z ramki danych, możemy użyć prostego porównania ==
aby porównać każdy element w kolumnie z podaną zmienną, tworząc pd.Series
of True i False
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Ten pd.Series
jest rozszerzeniem np.array
które jest rozszerzeniem prostej list
, np.array
możemy przekazać to akcesorium __getitem__
lub []
jak w powyższym przykładzie.
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
Maskowanie danych na podstawie wartości indeksu
To będzie nasza przykładowa ramka danych:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Możemy stworzyć maskę na podstawie wartości indeksu, tak jak na podstawie wartości kolumny.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Ale robienie tego jest prawie takie samo jak
df.loc['rose']
color red
size big
Name: rose, dtype: object
Ważną różnicą jest to, że gdy .loc
napotka tylko jeden wiersz w dopasowanym indeksie, zwróci pd.Series
, jeśli napotka więcej pasujących wierszy, zwróci pd.DataFrame
. To sprawia, że ta metoda jest raczej niestabilna.
To zachowanie można kontrolować, podając .loc
listę pojedynczych wpisów. Zmusi to do zwrócenia ramki danych.
df.loc[['rose']]
color size
name
rose red big