2016-02-28 31 views
1

我有一個通常包含數字的數據框列,但有些條目被寫爲'No Data'Python在忽略前導空格時,使用字符串替換數據幀列

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]}) 

然而,某些條目,如在上面的例子中,可以用一個空格作爲' No Data'啓動。我試圖找到一種有效的方式來替換NaN的所有No Data條目,而不必擔心額外的空間。現在,我有什麼是

df['group'].replace('No Data', np.nan) 
print df 

不工作,除非我把一個空間中搜索詞像

df['group'].replace(' No Data', np.nan) 

雖然這個作品,我希望有一個更好的辦法,我可以做到這一點沒有檢查額外的空間。

注意:我還可以通過list comprehension實現這一點,並使用in

[np.nan if 'No Data' in str(x) else x for x in df['group']] 

這會工作得很好,但我認爲replace更具有可讀性。

+0

@idjaw。謝謝。那裏的列是所有的字符串和像地圖(str.strip)一些技巧運作良好。由於數字輸入,這不起作用。那裏接受的答案涉及寫一個我不想要的函數,因爲我發佈的兩個選擇很好。我只是想看看有沒有更好的辦法 – PagMax

回答

1

可以實現通過一個正則表達式融入replace功能時,您期望的結果,您建議:

import pandas as pd 
import numpy as np 

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]}) 

df = df.replace(r'No Data', np.nan, regex=True) 
print df 

輸出

group 
0  1 
1  2 
2  3 
3 NaN 
4  4 
5  5 
6  6 

使用正則表達式r'No data'將在您的單元中的任意位置查找字符串'No data'。如果發現匹配,該單元將被替換爲np.nan

另一種方法是使用applymap將簡單的lambda函數應用於數據框中的每個單元格。我覺得這是一個非常可讀的解決方案:

import pandas as pd 
import numpy as np 

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]}) 

df = df.applymap(lambda x: np.nan if type(x) == str and 'No Data' in x else x) 
print df 

輸出

group 
0  1 
1  2 
2  3 
3 NaN 
4  4 
5  5 
6  6 
+1

謝謝@gtlambert。這兩種選擇都很好,並且喜歡'regex'方法。 – PagMax

+0

看起來像我甚至不需要添加'r'只需使用''無數據'與'regex = True'似乎工作 – PagMax

1

熊貓允許您使用正則表達式替換功能,所以你可以這樣做:

df['group'].replace("\s*No Data", np.nan, regex=True) 
+0

Thanks @bunji。我嘗試了這一點,但沒有把正則表達式=真! – PagMax

相關問題