Python Pandas - Vorsichtsmaßnahmen & Fallstricke
Vorsichtsmaßnahmen bedeuten Warnung und Gotcha bedeutet ein unsichtbares Problem.
Verwenden der If / Truth-Anweisung mit Pandas
Pandas folgt der Numpy-Konvention, einen Fehler auszulösen, wenn Sie versuchen, etwas in a umzuwandeln bool. Dies geschieht in einemif oder when Verwenden der Booleschen Operationen und or, oder not. Es ist nicht klar, was das Ergebnis sein soll. Sollte es wahr sein, weil es keine Nulllänge ist? Falsch, weil es falsche Werte gibt? Es ist unklar, also erhöht Pandas stattdessen aValueError - -
import pandas as pd
if pd.Series([False, True, False]):
print 'I am True'
Es ist output ist wie folgt -
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool() a.item(),a.any() or a.all().
Im ifBedingung ist es unklar, was damit zu tun ist. Der Fehler deutet darauf hin, ob a verwendet werden sollNone oder any of those.
import pandas as pd
if pd.Series([False, True, False]).any():
print("I am any")
Es ist output ist wie folgt -
I am any
Verwenden Sie die Methode, um Pandas-Objekte mit einem Element in einem booleschen Kontext auszuwerten .bool() - -
import pandas as pd
print pd.Series([True]).bool()
Es ist output ist wie folgt -
True
Bitweiser Boolescher Wert
Bitweise Boolesche Operatoren wie == und != gibt eine Boolesche Reihe zurück, was sowieso fast immer erforderlich ist.
import pandas as pd
s = pd.Series(range(5))
print s==4
Es ist output ist wie folgt -
0 False
1 False
2 False
3 False
4 True
dtype: bool
ist im Betrieb
Dies gibt eine boolesche Reihe zurück, die zeigt, ob jedes Element in der Reihe genau in der übergebenen Wertesequenz enthalten ist.
import pandas as pd
s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s
Es ist output ist wie folgt -
0 True
1 False
2 True
dtype: bool
Neuindizierung gegen ix Gotcha
Viele Benutzer werden feststellen, dass sie das verwenden ix indexing capabilities als prägnantes Mittel zur Auswahl von Daten aus einem Pandas-Objekt -
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']]
Es ist output ist wie folgt -
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
Dies ist in diesem Fall natürlich völlig gleichbedeutend mit der Verwendung von reindex Methode -
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'])
Es ist output ist wie folgt -
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
Einige könnten daraus schließen ix und reindexsind basierend darauf 100% äquivalent. Dies gilt nur für die Ganzzahlindizierung. Zum Beispiel kann die obige Operation alternativ ausgedrückt werden als -
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])
Es ist output ist wie folgt -
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
Es ist wichtig, sich daran zu erinnern reindex is strict label indexing only. Dies kann zu einigen möglicherweise überraschenden Ergebnissen in pathologischen Fällen führen, in denen ein Index beispielsweise sowohl Ganzzahlen als auch Zeichenfolgen enthält.