Python 根据数据框任意列中的值删除行

Python 根据数据框任意列中的值删除行,python,pandas,Python,Pandas,有几篇文章介绍了如何在数据帧中的一列包含某个不需要的字符串时删除行,但是如果我必须检查数据集中的所有列以查找该字符串,并且事先不知道哪个列包含该字符串,我正在努力解决如何删除行的问题 假设: data = pd.DataFrame({'col1' : ['December 31,', 'December 31, 2019', 'countryB', 'countryC'], 'col2' : ['December 31,', 21, 19, 18],

有几篇文章介绍了如何在数据帧中的一列包含某个不需要的字符串时删除行,但是如果我必须检查数据集中的所有列以查找该字符串,并且事先不知道哪个列包含该字符串,我正在努力解决如何删除行的问题

假设:

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
也就是说,我循环遍历数据中的所有列,在中存储要从数据中删除的行,删除重复的行(因为12月31日,出现在col1和col2中),获取唯一不需要的行的索引(此处为0)然后根据索引删除数据中的该行。它确实有效,但这似乎是实现这一目标的一种麻烦的方式

我想知道:有没有更好的方法来删除12月31日出现在任何列中的所有行?

使用
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)。任意(axis=1)
data.loc[~mask]
  • 您可以使用
    。应用
    方法来过滤这样的行
  • 使用
    r“December 31,$”
    regex是否适用于您的案例<代码>$表示字符串的结尾。如果不是,用你的工作正则表达式替换正则表达式
data[~data.apply(lambda x: any([True if re.match('December 31,$',str(y)) else False for y in x]), axis=1)]