2017-06-29 3 views
2

Ich habe einen DataFrame mit vielen Spalten, und ich möchte Zeilen entfernen, wo die Werte für einige Spalten sind null. Ich weiß, wie dies mit einer Spalte zu tun:Entfernen Sie Zeilen, wenn einer der Werte Null ist

df = df[df['Column'] != ''] 

Ich mag diese von Spalten mit einem Satz zu tun, etwa so:

df = df['' not in [df['Column1'], df['Column2'], df['Column3']]' 

jedoch gibt dies den Fehler:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Wie mache ich das?

Antwort

3

Wenn Werte sind leere Strings erstellen Teilmenge und für alle True s pro Zeile hinzufügen all oder any:

df = df[(df[['Column1', 'Column2', 'Column1']] != '').all(axis=1)] 

df = df[~(df[['Column1', 'Column2', 'Column1']] == '').any(axis=1)] 

Und wenn Werte sind NaN s, None s Verwenden Sie dropna mit Parameter subset:

df = df.dropna(subset=['Column1', 'Column2', 'Column1']) 

Probe:

df = pd.DataFrame({'A':[np.nan,'','p','hh','f'], 
        'B':['',np.nan,'','','o'], 
        'C':['a','s','d','f','g'], 
        'D':['f','g','h','j','k'], 
        'E':['l','i',np.nan,'u','o'], 
        'F':['','','o','i',np.nan]}) 

print (df) 
    A B C D E F 
0 NaN  a f l  
1  NaN s g i  
2 p  d h NaN o 
3 hh  f j u i 
4 f o g k o NaN 

df1 = df.dropna(subset=['A', 'B', 'F']) 
print (df1) 
    A B C D E F 
2 p d h NaN o 
3 hh f j u i 

df2 = df[(df[['A', 'B', 'F']] != '').all(axis=1)] 
print (df2) 
    A B C D E F 
4 f o g k o NaN 

df2 = df[~(df[['A', 'B', 'F']] == '').any(axis=1)] 
print (df2) 
    A B C D E F 
4 f o g k o NaN 

EDIT:

Für den Vergleich Strings und einige Spalte ist numerisch erhalten:

TypeError: Could not compare [''] with block values

Es gibt 2 Lösungen für sie - vergleichen numpy Array erstellt von values oder Werte konvertieren zu string s von astype:

df = pd.DataFrame({'A':[np.nan,7,8,8,8], 
        'B':['',np.nan,'','','o'], 
        'C':['a','s','d','f','g'], 
        'D':['f','g','h','j','k'], 
        'E':['l','i',np.nan,'u','o'], 
        'F':['','','o','i',np.nan]}) 

print (df) 
    A B C D E F 
0 NaN  a f l  
1 7.0 NaN s g i  
2 8.0  d h NaN o 
3 8.0  f j u i 
4 8.0 o g k o NaN 

df2 = df[(df[['A', 'B', 'F']].values != '').all(axis=1)] 
print (df2) 
    A B C D E F 
4 8.0 o g k o NaN 

df2 = df[(df[['A', 'B', 'F']].astype(str) != '').all(axis=1)] 
print (df2) 
    A B C D E F 
4 8.0 o g k o NaN 
+0

Ich habe Ihre erste Zeile versucht, 'df = df [(df [['Spalte1', 'Spalte2', 'Spalte1']]! = '') .alle (Achse = 1)]', Ich bekomme 'TypeError: Konnte Vergleiche [''] mit Blockwerten nicht. – Bluefire

+0

Es gibt ein Problem mit gemischten Werten, z numerisch mit Zeichenfolgen. Eine einfachere Lösung ist das Konvertieren von Daten in ein numpy Array und dann das Vergleichen von 'df = df [(df [[' Column1 ',' Column2 ',' Column1 ']]] Werte! =' ') .all (axis = 1)] ' – jezrael

+0

Ich bearbeite Antwort, bitte überprüfen Sie es. – jezrael

Verwandte Themen