如何在 pandas DataFrame 上用 NaN 替换整个单元格

Ha *_*ran 4 python pandas

我想用空格或 NaN 替换包含图片中圈出的单词的整个单元格。然而,当我尝试替换“1.25 Dividend”时,结果显示为“1.25 NaN”。我想将整个单元格返回为“NaN”。知道如何解决这个问题吗?

我的数据框

piR*_*red 5

选项 1
在替换中使用正则表达式

df.replace('^.*Dividend.*$', np.nan, regex=True)
Run Code Online (Sandbox Code Playgroud)

来自评论

(使用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
Run Code Online (Sandbox Code Playgroud)

那么所提出的解决方案产生

   0    1
0  1  NaN
1  3  4.0
2  5  NaN
Run Code Online (Sandbox Code Playgroud)

选项 2
另一种选择是pd.DataFrame.maskapplymap.
如果我将 a 传递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
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)