2017-06-10 3 views
2

Ich habe einen Datenrahmen (in Python) wie folgt:Wie ersetzt man Bindestriche in einem Python-Datenrahmen durch NaN?

 A  B C D  E  F  G H 

0 T-1 2 3 - M-7  2   2 

1 T-2 5 4 2 M-7  4   3 

2 T-3 - - 3 M-7   9 4 

3 T-4 6 - 4 M-7  -  9 5 

4 T-5 - 1 5 M-7  8   6 

Ich möchte die Striche ersetzen (ohne die in Spalte A und E) mit NaN.

Ich versuchte df.replace('-', np.nan). Es endete mit dem Ersetzen der gesamten Zellen der Spalten A und E sowie. Ich denke, ich kann df[column_name].replace('-',np.nan) verwenden, aber dann müsste ich es für jede Spalte separat anwenden.

Gibt es einen anderen Weg, der effizient ist und für beliebig viele Spalten mit ähnlichen Einschränkungen funktioniert?

+2

'df.replace ('-', np.nan)' sollte funktionieren. Nicht sicher, warum es nicht für dich arbeitet. –

+1

Wie ich in der Frage erwähnt habe, funktioniert 'df.replace ('-', np.nan)' mehr als ich benötige. Ich möchte, dass die Spalten A und E so bleiben, wie sie sind, aber die Striche der anderen Spalten sollten ersetzt werden. – dravid07

+1

Die Verwendung von 'df.replace ('-', np.nan)' sollte in den Spalten A und E nichts ändern. Es sollte nur die Bindestriche in den anderen Spalten ersetzen. Es sollte genau das tun, was du willst, also verstehe ich nicht, warum es nicht für dich funktioniert. Ich kann dieses Problem nicht reproduzieren. –

Antwort

1

Dies sollte funktionieren.

df = pd.DataFrame({'A': list('abcde'), 
        'B': ['T-1', 'T-2', 'T-3', 'T-4', 'T-5'], 
        'C': ['a', '-', 'c', 'd', '-'], 
        'D': ['-', 'b', 'c', 'd', 'e'], 
        'E': ['M-7', 'M-7', 'M-7', 'M-7', 'M-7'], 
        'F': ['a', '-', 'c', '-', '-'], 
        'G': ['a', 'b', 'c', 'd', '-'], 
        'H': ['a', 'b', '-', 'd', '-'] 
        }) 

df = df.astype(str) 

s = df.applymap(lambda x: re.sub(r'^-$', str(np.NaN), x)) 

Ausgang:

A B C D E F G H 
0 a T-1 a nan M-7 a a a 
1 b T-2 nan b M-7 nan b b 
2 c T-3 c c M-7 c c nan 
3 d T-4 d d M-7 nan d d 
4 e T-5 nan e M-7 nan nan nan 
+0

Ihre Methode ist großartig. Aber für den Datenrahmen, den ich oben angegeben habe *, erhalte ich einen Fehler: 'TypeError: ('erwartete Zeichenfolge oder Byte-ähnliches Objekt', 'trat bei Index B auf'). – dravid07

+0

Konvertieren Sie alle Spalten in Ihrem Datenframe in string-Typ und es wird für Sie funktionieren, so: df.astype (str) –

0
In [18]: df[df.columns.drop(['A','E'])] = \ 
      df[df.columns.drop(['A','E'])].replace('-', np.nan) 

In [19]: df 
Out[19]: 
    A B C D E F G H 
0 a T-1 a NaN M-7 a a a 
1 b T-2 NaN b M-7 NaN b b 
2 c T-3 c c M-7 c c NaN 
3 d T-4 d d M-7 NaN d d 
4 e T-5 NaN e M-7 NaN NaN NaN 
Verwandte Themen