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