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

选项 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.mask与applymap.
如果我将 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)