【问题标题】:Remove DF Rows Based on a CSV File (Pandas,Python3)删除基于 CSV 文件的 DF 行 (Pandas,Python3)
【发布时间】:2014-09-30 18:36:44
【问题描述】:

现在,我正在尝试创建一个函数,该函数根据 Excel 文件中列出的某些条件删除行。这个 excel 文件(坏词 2)包含应该从 DF 中删除的词对,如下所示:

header
the man
is a

我的代码的第二部分是我要应用的函数

import pandas as pd
data = ({'words':['the man','is a','good guy']})
df = pd.DataFrame(data)

xl = pd.ExcelFile('C:/Users/j/Desktop/bad words2.xlsx')
badwords = xl.parse()
badwords = badwords['header']

def removewords(x):
    for w in x:
        pattern = '^'+''.join('(?=.*{})'.format(word) for word in w.split())
        df[df['words'].str.contains(pattern)==False]
        df.dropna()


 print(removewords(badwords))

因此,理想情况下,在应用此函数结束时,我应该得到一个仅包含以下内容的 DF:

 words
 good guy

但是,现在,这个函数返回的只是“无”。我做错了什么?

【问题讨论】:

  • 对不起,您只是想过滤掉模式中的单词还是过滤掉模式中没有的单词?无论如何不清楚您要做什么,但是如果没有分配,这条线什么也不做:df[df['words'].str.contains(pattern)==False] 应该是 df = df[df['words'].str.contains(pattern)==False]

标签: python-3.x pandas


【解决方案1】:

一些想法:

  1. 最后两个操作返回一个新的 DataFrame。 IE。他们不会就地修改 DataFrame。您需要将这些操作的结果分配给某些东西,例如df。
  2. 然后如果您执行上述操作,则变量df 无法在函数范围内进行赋值。您可以将其作为参数传入。 (请注意:这不是您的代码的问题,而是建议的解决方案。)或者,您可以在函数中实例化一个新的 DataFrame。
  3. 您没有在函数结束时返回 DataFrame。

试试吧:

def removewords(df,x):
    for w in x:
        pattern = '^'+''.join('(?=.*{})'.format(word) for word in w.split())
        df = df[df['words'].str.contains(pattern)==False]
        df = df.dropna()
    return df

print(removewords(df,badwords))

【讨论】:

  • 您好,伯尼,感谢您的意见。但是,当我尝试将任何类型的变量分配给 df(即 df = )时,我收到错误 UnboundLocalError: local variable 'df' referenced before assignment
  • 所以问题解决了,第二个问题出现了——所做的更改不会“堆叠”在 for 循环中。所以使用上面的代码,返回输出是“is a / good guy”。我希望删除出现在我的 excel 文件中的所有单词对,以便我的最终返回输出只是 'Good Guy'
  • 我在return 语句的缩进中犯了一个错误。请查看已编辑的代码,它现在可以满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2022-07-08
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多