2016-12-20 5 views
1

Ich versuche, einen Datenrahmen basierend auf mehreren Bedingungen zu filtern. Dann möchte ich diese Teilmenge aus einem separaten, viel größeren Datenrahmen löschen.Pandas: Drop Subset von Datenrahmen mit ~

df = pd.DataFrame({ 'A' : ['UNKNOWN','UNK','TEST','TEST'], 
        'E' : pd.Categorical(["test","train","test","train"]), 
        'F' : 'foo' }) 

df2 = pd.DataFrame({ 'A' : ['UNKNOWN','UNK','TEST','TEST','UNKOWN','UNKKK'], 
        'E' : pd.Categorical(["test","train","test","train",'train','train']), 
        'D' : np.array([3] * 6,dtype='int32'), 
        'F' : 'foo' }) 

rgx = r'UNKNOWN|UNK' 
df_drop = df.loc[df['A'].str.contains(rgx, na=False, flags=re.IGNORECASE, regex=True, case=False)] 
df2 = df2[~df_drop] 

Ich möchte die folgende Ausgabe für df2:

  A D  E F 
2  TEST 3 test foo 
3  TEST 3 train foo 

Stattdessen bekomme ich folgende Fehlermeldung:

TypeError: bad operand type for unary ~: 'str'

Der Grund, warum ich nicht df2 direkt Filterung habe ist, dass ich machen möchte df_drop seinen eigenen separaten Datenrahmen, um die Datensätze zu behalten, die ich fallen gelassen habe.

Ich glaube, ich missverstände, wie die Unary funktionieren soll. Oder ich habe einen Syntaxfehler gemacht. Aber ich kann es nicht finden und keine der vorherigen Lösungen (zum Beispiel removing NaNs from the dataframe) scheint hier anwendbar zu sein.

+1

Teil meiner ursprünglichen Kommentar steht noch, was Sie bestanden war kein boolean Maske, es war ein df. Wenn Sie eine Maske basierend auf "df" genommen hätten, wäre es immer noch fehlgeschlagen, weil die Länge der Maske von der Länge von 'df2' abweicht. – EdChum

+0

Das macht Sinn. Ich wusste nicht, dass ich eine boolesche Maske anstelle eines Datenrahmens brauchte. Ich sehe das Problem jetzt. Vielen Dank! – ale19

Antwort

4

Ich glaube, Sie in großen Datenrahmen filtern müssen:

rgx = r'UNKNOWN|UNK' 
mask = df2['A'].str.contains(rgx, na=False, flags=re.IGNORECASE, regex=True, case=False) 
print (mask) 
0  True 
1  True 
2 False 
3 False 
4  True 
5  True 
Name: A, dtype: bool 

print (df2[~mask]) 
     A D  E G 
2 TEST 3 test foo 
3 TEST 3 train foo 
+1

Eigentlich ist dies die semantisch korrekte Antwort nach dem Blick auf die OP-Antwort. +1 – EdChum

+1

@EdChum - Danke. – jezrael

+0

Das ist perfekt, danke! Ich werde deine Antwort in Kürze annehmen! – ale19

Verwandte Themen