2017-06-10 46 views
2

我有一個數據幀(在Python)如下:如何用NaN替換python數據框中的破折號?

 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 

我想替換破折號與NaN不含那些在列A和E)。

我試過df.replace('-', np.nan)。它最終取代了列A和E的整個單元格。我想我可以使用df[column_name].replace('-',np.nan)但我必須分別將它應用於每列。

是否有任何其他方式,這是有效的,並將工作的任何數量的列有類似的限制?

+2

'df.replace( ' - ',np.nan)'應該工作。不知道爲什麼它不適合你。 –

+1

正如我在問題中提到的那樣,'df.replace(' - ',np.nan)'比我需要的更有效。我想列A和E保持原樣,但其他列的破折號應該被替換。 – dravid07

+1

使用'df.replace(' - ',np.nan)'不應該更改列A和E中的任何內容。它應該只替換其他列中的破折號。它應該做你想要的,所以我不明白爲什麼它不適合你。我無法重現這個問題。 –

回答

1

這應該工作。

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)) 

輸出:

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

你的方法很棒。但是對於上面給出的*的數據框,我得到一個錯誤:'TypeError:('expected string or bytes-like object',''in index B')''。 – dravid07

+0

將數據框中的所有列轉換爲字符串類型,它將適用於您,如下所示: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 
相關問題