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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow