gpt4 book ai didi

python - 根据数据框任何列中的值删除行

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:02 27 4
gpt4 key购买 nike

有几篇文章介绍了如果数据框中的 一个 列包含某个不需要的字符串,如何删除行,但如果我必须检查所有<,我正在努力解决如何做到这一点/em> 数据集中包含该字符串的列,如果我事先不知 Prop 体是哪一列包含该字符串。

假设:

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

我想删除所有包含 December 31, 的行,但如果 December 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中我想从data中删除的行,删除重复项(因为 December 31, 出现在 col1 和 col2 中),获取唯一不需要的行(此处为 0)的索引,然后根据索引删除 data 中的该行。它确实有效,但这似乎是实现这一目标的一种麻烦方式。

我想知道:是否有更好的方法来删除December 31,出现在任何列中的所有行?

最佳答案

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,$"' 正则表达式不适合您的情况吗? $ 表示字符串结尾。如果不只是用您的工作正则表达式替换正则表达式。

关于python - 根据数据框任何列中的值删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com