Python Pandas - zastrzeżenia i problemy

Ostrzeżenia oznaczają ostrzeżenie, a gotcha oznacza niewidoczny problem.

Używanie stwierdzenia If / Truth z Pandami

Pandy przestrzegają konwencji numpy polegającej na zgłaszaniu błędu, gdy próbujesz przekonwertować coś na plik bool. Dzieje się to wif lub when używając operacji logicznych, oraz orlub not. Nie jest jasne, jaki powinien być wynik. Czy powinno być prawdziwe, ponieważ nie ma długości zerowej? Fałsz, ponieważ istnieją wartości Fałsz? Nie jest to jasne, więc zamiast tego Pandy podnosiValueError -

import pandas as pd

if pd.Series([False, True, False]):
   print 'I am True'

Jego output wygląda następująco -

ValueError: The truth value of a Series is ambiguous. 
Use a.empty, a.bool() a.item(),a.any() or a.all().

W ifwarunku, nie jest jasne, co z tym zrobić. Błąd sugeruje, czy użyć plikuNone lub any of those.

import pandas as pd

if pd.Series([False, True, False]).any():
   print("I am any")

Jego output wygląda następująco -

I am any

Aby ocenić jednoelementowe obiekty pandy w kontekście logicznym, użyj metody .bool() -

import pandas as pd

print pd.Series([True]).bool()

Jego output wygląda następująco -

True

Bitwise Boolean

Bitowe operatory logiczne, takie jak == i != zwróci szereg boolowski, który i tak jest prawie zawsze wymagany.

import pandas as pd

s = pd.Series(range(5))
print s==4

Jego output wygląda następująco -

0 False
1 False
2 False
3 False
4 True
dtype: bool

operacja isin

Zwraca serię logiczną pokazującą, czy każdy element w serii jest dokładnie zawarty w przekazanej sekwencji wartości.

import pandas as pd

s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s

Jego output wygląda następująco -

0 True
1 False
2 True
dtype: bool

Reindeksowanie vs ix Gotcha

Wielu użytkowników będzie używać rozszerzenia ix indexing capabilities jako zwięzły sposób wyboru danych z obiektu Pandas -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[['b', 'c', 'e']]

Jego output wygląda następująco -

one        two      three       four
a   -1.582025   1.335773   0.961417  -1.272084
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
d   -2.380648  -0.029981   0.196489   0.531714
e    1.846746   0.148149   0.275398  -0.244559
f   -1.842662  -0.933195   2.303949   0.677641

          one        two      three       four
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
e    1.846746   0.148149   0.275398  -0.244559

Jest to oczywiście całkowicie równoważne w tym przypadku z użyciem reindex metoda -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.reindex(['b', 'c', 'e'])

Jego output wygląda następująco -

one        two      three       four
a    1.639081   1.369838   0.261287  -1.662003
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
d   -1.078791  -0.612607  -0.897289  -1.146893
e    0.465215   1.552873  -1.841959   0.329404
f    0.966022  -0.190077   1.324247   0.678064

          one        two      three       four
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
e    0.465215   1.552873  -1.841959   0.329404

Niektórzy mogą to stwierdzić ix i reindexsą w 100% równoważne na tej podstawie. Jest to prawdą, z wyjątkiem przypadku indeksowania liczb całkowitych. Na przykład powyższą operację można alternatywnie wyrazić jako -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])

Jego output wygląda następująco -

one        two      three       four
a   -1.015695  -0.553847   1.106235  -0.784460
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
d   -1.238016  -0.749554  -0.547470  -0.029045
e   -0.056788   1.063999  -0.767220   0.212476
f    1.139714   0.036159   0.201912   0.710119

          one        two      three       four
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
e   -0.056788   1.063999  -0.767220   0.212476

    one  two  three  four
1   NaN  NaN    NaN   NaN
2   NaN  NaN    NaN   NaN
4   NaN  NaN    NaN   NaN

Należy o tym pamiętać reindex is strict label indexing only. Może to prowadzić do potencjalnie zaskakujących wyników w przypadkach patologicznych, w których indeks zawiera, powiedzmy, zarówno liczby całkowite, jak i łańcuchy.