2017-07-06 94 views

回答

4

選項1
使用正則表達式的替換

df.replace('^.*Dividend.*$', np.nan, regex=True) 

從評論

(使用regex=True)意味着它會解釋這個問題作爲一個正則表達式之一。你仍然需要一個適當的模式。 '^'表示從字符串的開頭開始。 '^.*'匹配字符串開頭的所有字符。 '$'表示結束與字符串結尾的匹配。 '.*$'匹配直到字符串末尾的所有字符。最後,'^.*Dividend.*$'匹配從一開始的所有字符,在中間的某個位置有'Dividend',之後是任何字符。然後用np.nan

考慮數據框df

df = pd.DataFrame([[1, '2 Dividend'], [3, 4], [5, '6 Dividend']]) 
df 

    0   1 
0 1 2 Dividend 
1 3   4 
2 5 6 Dividend 

然後提出的解決方案產量

0 1 
0 1 NaN 
1 3 4.0 
2 5 NaN 

選項2
另一種方法是使用pd.DataFrame.mask在更換這整個事情conju與applymap
如果我將lambda傳遞給applymap,它將標識是否有任何單元格中有'Dividend'

df.mask(df.applymap(lambda s: 'Dividend' in s if isinstance(s, str) else False)) 

    0 1 
0 1 NaN 
1 3 4 
2 5 NaN 

選項3
概念相似,但使用stack/unstack + pd.Series.str.contains

df.mask(df.stack().astype(str).str.contains('Dividend').unstack()) 

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

'''pd.np.nan'''也可以得到同樣的結果,如果你不希望導入'''numpy'''明確。 – TrigonaMinima

+0

嗨,它的作品!起初我把正則表達式設置爲False。那麼這意味着如果我們將regex設置爲True,它將取代整個單元格? –

+0

@HaAnTran不!這意味着它將把這個問題解釋爲一個正則表達式。你仍然需要一個適當的模式。 「^」表示從字符串的開頭開始。 ''^。*''匹配字符串開頭的所有字符。 ''$''表示結束與字符串結尾的匹配。 ''。* $''匹配到字符串末尾的所有字符。最後,''。*。* Dividend。* $''匹配所有開頭的字符,中間有'Dividend',之後是任何字符。然後用'np.nan'替換整個事件 – piRSquared

0

全部替換字符串:

df.apply(lambda x: pd.to_numeric(x, errors='coerce')) 
+0

如果單元格是字符串而OP想要保持字符串呢? OP要求更換股息單元。你可以將其修改爲'df.mask(df.apply(lambda x:pd.to_numeric(x,errors ='coerce'))。isnull())',但是會遇到這個問題,它會掩蓋任何其他的字符串像「Cash」或「Shares」或類似的單元格。 – piRSquared

0

我會用applymap這樣

df.applymap(lambda x: 'NaN' if (type(x) is str and 'Dividend' in x) else x)