[英]How to replace an entire cell with NaN on pandas DataFrame
我想用空格或NaN替換包含圖中帶圓圈的單詞的整個單元格。 然而,當我嘗試更換例如'1.25 Dividend'時,結果卻是'1.25 NaN'。 我想把整個細胞歸還為'NaN'。 知道如何處理這個嗎?
選項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
與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
替換所有字符串:
df.apply(lambda x: pd.to_numeric(x, errors='coerce'))
我會像這樣使用applymap
df.applymap(lambda x: 'NaN' if (type(x) is str and 'Dividend' in x) else x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.