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.