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