【问题标题】:Pandas filter not working as expectedPandas 过滤器未按预期工作
【发布时间】:2015-03-17 16:04:14
【问题描述】:

我有一个 pandas 数据框,我需要在其中删除与给定列中的正则表达式模式不匹配的某些行。我需要运行正则表达式的列的格式为:lastname,firstname,我想删除该列中与该格式不匹配的所有行。我正在尝试使用 pandas 过滤方法,并且我尝试过以这种方式使用命令:
edited_df = idf['Name'].filter(regex="([aA-zZ]*)([,]{1})([aA-zZ]*)")
edited_df = idf['Name'].filter(regex="/([aA-zZ]*)([,]{1})([aA-zZ]*)/")
但是,这样做会产生此错误:
TypeError: can't use a string pattern on a bytes-like object
type(idf['Name']) 的结果是一个系列,其中的每个条目都是一个字符串,每个 type(idf['CIO'][1])
我看到了这个问题Pandas filter rows,但我想让我的程序更加模块化,并且不必每次添加名称时都调整名称列表。
我用测试字符串在http://pythex.org/ 测试了我的正则表达式,它符合预期,所以我假设我错误地使用了过滤器方法。非常感谢任何帮助。
此外,一个不太重要的问题是是否可以访问从修改后的数据帧中的正则表达式创建的捕获组。

【问题讨论】:

  • 你可以试试idf[idf['Name'].str.contains(r"([aA-zZ]*)([,]{1})([aA-zZ]*)")]
  • @EdChum 我得到了这个错误,ValueError: cannot index with vector containing NA / NaN values 即使在使用了 fillna (idf['Name'].fillna(value=0, inplace=True)) 之后。
  • 尝试先删除 NaN 值,以便 idf['Name'].dropna()

标签: python regex python-3.x pandas


【解决方案1】:

感谢 EdChum 的 cmets,以下是解决此问题的方法:
首先,使用以下方法删除 NaN 值:

idf.dropna(subset=['Name'], inplace=True)

然后,使用str.contains 代替过滤器:

edited_df = idf[idf['Name'].str.contains(r"([aA-zZ]*)([,]{1})([aA-zZ]*)")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多