如果特定单词存在Python,则将行值替换为NaN

2024-04-20 10:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在清理数据帧,我想检查数据帧中的单词列表是否有任何值。如果存在,则该值应替换为NA值。例如

我的数据帧就像。在

p['title']

1                                             Forest
2                                            [VIDEO_TITLE]
3                                            [VIDEO_TITLE]
4                                            [VIDEO_TITLE]
5                                [${title}url=${videourl}]


p.dtypes
title    object
dtype: object

以及

^{pr2}$

由于第2、3、4、5行中有c中的单词,所以我希望用NA值替换它。在

我正在尝试以下方法

p['title'].replace('|'.join(c),np.NAN,regex=True).fillna('NA')

这个程序运行正常,但是我得到的输入和输出是一样的。根本没有变化。在

我的下一个尝试是

p['title'].apply(lambda x: 'NA' if any(s in x for s in c) else x)

这是在抛出一个错误

TypeError: argument of type 'float' is not iterable

我正在尝试其他几件事,但没有成功。我不知道我犯了什么错误。在

我的理想输出是

p['title']

1     Forest
2        NA
3        NA
4        NA
5        NA

有谁能帮我解决这个问题吗?在


Tags: 数据inurl列表objecttitlevideo错误
2条回答
>>> import pandas as pd
>>> import numpy as np

>>> df = pd.DataFrame({'A' : ('a','b','c', 'd', 'a', 'b', 'c')})
>>> restricted = ['a', 'b', 'c']
>>> df[df['A'].isin(restricted)] = np.NAN
>>> df
 A
0  NaN
1  NaN
2  NaN
3    d
4  NaN
5  NaN

您可以loc将它们设置为'NA'。由于您的值有时在列表中,因此首先需要从列表中提取它们。第二行从列表中提取第一个字符串(如果它在列表中)。第三行检查是否匹配。在

c = ('${title}', 'VIDEO_TITLE')
string_check = p['title'].map(lambda x: x if not isinstance(x, list) else x[0])
string_check = string_check.map(lambda s: any(c_str in s for c_str in c))
p.loc[string_check, 'title'] = 'NA'

根据您正在执行的操作,您可能需要考虑将值设置为numpy.nan,而不是字符串'NA'。这是pandas处理空值的常用方法,已经有很多功能围绕这一点构建。在

相关问题 更多 >