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

时间:2016-03-21 15:56:35

标签: python python-2.7 numpy pandas data-cleansing

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

我的数据框就像。

p['title']

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


p.dtypes
title    object
dtype: object

c= ('${title}', '[VIDEO_TITLE]')

由于行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:'float'类型的参数不可迭代

我正在尝试其他一些事情但没有取得多大成功。我不确定我在做什么错。

我理想的输出是,

p['title']

1     Forest
2        NA
3        NA
4        NA
5        NA

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以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处理空值的常用方法,并且已经围绕此构建了许多功能。

答案 1 :(得分:1)

>>> 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