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.