2017-11-15 3 views
6

Beschreibung

I pandas.eval auf einer boolean Serie mit fehlenden Daten verwenden.pandas.eval mit einer boolean Serie mit fehlenden Daten

Dazu verwende ich einen Indexer zum Markieren von Nicht-Null-Werten und .loc, um nur .eval auf die Zeilen mit nicht fehlenden Daten anzuwenden.

Die Anwendung des logischen Nicht-Operators mit dem Ausdruck ~bool oder not(bool) ergibt -1 oder -2.

Ich verstehe, dass dies, weil meine boolean Serie als Objekttyp wegen der fehlenden Werte gegossen wird, aber ich frage mich:

  • Warum die -1 und -2-Ausgang?
  • Was wäre der richtige Weg, .eval für eine boolesche Reihe mit fehlenden Daten zu verwenden?

Beispiel

ist hier ein reproduzierbares Beispiel Pandas 0.20.3 verwendet wird.

df = pd.DataFrame({'bool': [True, False, None]}) 
    bool 
0 True 
1 False 
2 None 

indexer = ~pd.isnull(df['bool']) 
0  True 
1  True 
2 False 
Name: bool, dtype: bool 

df.loc[indexer].eval('~bool') 
0 -2 
1 -1 
Name: bool, dtype: object 
+0

Aber ich wurde immer Wert Fehler – Dark

+0

Warum nicht Casting zu bool vor der Bewertung ie 'df.loc [indexer] .astype (bool) .eval ('~ bool')'. Ich bin auch neugierig, warum Sie -2 und -1 – Dark

+0

Ich kann nicht werfen, weil ich nicht boolesche Spalten drin haben kann (eval gilt für den gesamten Datenrahmen und nicht nur für eine Spalte). z.B. Ich möchte mit 'df.eval ('~ bool & (num> 1)') umgehen können' where num ist eine numerische Spalte. – Alex

Antwort

2

Für eval, ~ Karten op.invert als seen in the source code here.

_unary_ops_syms = '+', '-', '~', 'not' 
_unary_ops_funcs = op.pos, op.neg, op.invert, op.invert 
_unary_ops_dict = dict(zip(_unary_ops_syms, _unary_ops_funcs)) 

Wenn also Ihre Serie von guten alten object Typ ist, was Sie sehen, hier ist

>>> ~True 
-2 
>>> ~False 
-1 

# or with your Series 
>>> ~pd.Series(True, dtype='object') 
0 -2 
dtype: object 

Wo Sie

>>> ~pd.Series(True) 
0 False 
dtype: bool 

Die Ausgänge ~True -> -2 wollen und ~False -> -1 sind, weil bool ein Unterabschnitt ist Lass von int in Python und -2, -1 sind die bitweisen Komplemente von 1 und 0.


Die offensichtliche Lösung ist, um die Serie zu bool Typ entweder zu konvertieren vorher mit astype(bool) in einem extra setp, oder wenn aus irgendeinem Grund können Sie nicht tun, bevor die eval,

>>> df.loc[indexer].eval('~bool.astype("bool")') 
0 False 
1  True 
Name: bool, dtype: bool 
Verwandte Themen