Python 如何在数据帧上用NaN替换整个单元格

Python 如何在数据帧上用NaN替换整个单元格,python,pandas,Python,Pandas,我想用空格或NaN替换包含图片中圈出的单词的整个单元格。然而,当我尝试替换例如“1.25股息”时,结果是“1.25 NaN”。我想把整个牢房归为“NaN”。你知道怎么做吗 选项1 在替换中使用正则表达式 df.replace('^.*Dividend.*$', np.nan, regex=True) 根据评论 (使用regex=True)意味着它将把问题解释为正则表达式问题。你仍然需要一个合适的模式。“^”表示从字符串的开头开始“^.*”匹配字符串开头的所有字符“$”表示以字符串结尾结束匹配'

我想用空格或NaN替换包含图片中圈出的单词的整个单元格。然而,当我尝试替换例如“1.25股息”时,结果是“1.25 NaN”。我想把整个牢房归为“NaN”。你知道怎么做吗


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

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

(使用
regex=True
)意味着它将把问题解释为正则表达式问题。你仍然需要一个合适的模式。
“^”
表示从字符串的开头开始<代码>“^.*”匹配字符串开头的所有字符
“$”
表示以字符串结尾结束匹配<代码>'.*$'匹配字符串末尾的所有字符。最后,<代码> ^ **红利** $ '/c>匹配开始时的所有字符,中间有“代码”>“红利”<代码>,然后在其后面的任何字符。然后用
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
,它标识任何单元格中是否有
“红利”

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
概念类似,但使用
堆栈
/
取消堆栈
+
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)

如果您不想显式导入
numpy
,则
pd.np.nan
也将给出相同的结果。您好,它可以工作!起初,我将regex设置为False。这意味着如果我们将regex设置为True,它将替换整个单元格?@HaAnTran no!这意味着它将把问题解释为正则表达式问题。你仍然需要一个合适的模式。
“^”
表示从字符串的开头开始<代码>“^.*”
匹配字符串开头的所有字符
“$”
表示以字符串结尾结束匹配<代码>'.*$'
匹配字符串末尾的所有字符。最后,<代码> ^ **红利** $ '/c>匹配开始时的所有字符,中间有“代码”>“红利”<代码>,然后在其后面的任何字符。然后用
np.nan
替换这整件事,如果单元格是字符串,OP想保留字符串呢?OP要求更换股息单元格。您可以将其修改为
df.mask(df.apply(lambda x:pd.to_numeric(x,errors='concurve')).isnull())
,但它也会屏蔽任何其他类似字符串的单元格,如
Cash
Shares
等。