关于如何在数据框中的一个列包含某个不希望的字符串的情况下删除行的问题,有几篇文章,但是如果我必须检查 all < / em>中该字符串的数据集中的列,如果我事先不确切知道包含该字符串的列,则为AND。
假设:
data = pd.DataFrame({'col1' : ['December 31,', 'December 31, 2019', 'countryB', 'countryC'],
'col2' : ['December 31,', 21, 19, 18],
'col3' : [np.NaN, 22, 23, 14]})
哪个给:
col1 col2 col3
0 December 31, December 31, NaN
1 December 31, 2019 21 22.0
2 countryB 19 23.0
3 countryC 18 14.0
我要删除包含 12月31日的所有行,但是如果 12月31日后跟以YYYY格式的年份,则不希望删除。为此使用正则表达式:r'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec(?!.*\d{4})'
,它只能正确标识 12月31日。
问题是我有很多这样的表格,并且我不知道 12月31日(或其他月份的等价金额)出现在哪一列中。
我目前要做的是:
delete = pd.DataFrame(columns = data.columns)
for name, content in data.iteritems():
take = data[data[name].astype(str).str.contains(r'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec(?!.*\d{4})',
regex = True,
flags = re.IGNORECASE & re.DOTALL, na = False)]
delete = delete.append(take)
delete = delete.drop_duplicates()
index = mean(delete.index)
clean = data.drop([index])
根据需要返回哪个:
col1 col2 col3
1 December 31, 2019 21 22.0
2 countryB 19 23.0
3 countryC 18 14.0
也就是说,我遍历数据中的所有列,将要从 data 中删除的行存储在 delete 中,删除重复项(因为 12月31日出现在col1和col2中),获取唯一的不希望有的行的索引(此处为0),然后根据该索引在 data 中删除该行。它确实有效,但这似乎是实现此目的的繁琐方法。
我想知道:是否有更好的方法删除 any 列中显示 12月31日的所有行?
答案 0 :(得分:1)
使用pd.DataFrame.any(...)
mask = data.astype(str).apply(lambda x: x.str.contains(r'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec(?!.*\d{4})',
regex = True, flags = re.IGNORECASE & re.DOTALL, na = False)).any(axis=1)
data.loc[~mask]
答案 1 :(得分:1)
data[~data.apply(lambda x: any([True if re.match('December 31,$',str(y)) else False for y in x]), axis=1)]
.apply
方法来过滤这样的行。 r"December 31,$"'
正则表达式吗? $
代表字符串的结尾。如果不是,则只用工作的正则表达式替换正则表达式。