【问题标题】:pandas filter column values by multiple valuespandas 按多个值过滤列值
【发布时间】:2018-09-10 23:23:47
【问题描述】:

我的 df 包含多个列,例如 MLB、NBA、NHL、NFL、TESTNBA 我想返回一个列表,其中列中包含字符串 MLB 或 NBA。如下所示:

df_check = ['MLB', 'NBA', 'TESTNBA']

value_cols = [col for col in df.columns if df_check in col]

上述失败并出现以下错误:

TypeError: 'in' 需要字符串作为左操作数,而不是列表

有什么方法可以按多个值过滤列?

【问题讨论】:

  • 您在NBA' 中缺少'。将其更改为 df_check = ['MLB', 'NBA']
  • 如果我理解正确,您想从整个数据框中选择 2 列,对吗?这种情况你可以试试:df1 = df[['MLB','NBA']]
  • 或者只是 df[df_check] 但如果 df 中不存在密钥,它将引发错误。如果 df 中的键是正确且预期的,它将起作用。
  • 是的,但是让我调整一下问题。字符串 MLB 和 NBA 可能在其他列中,所以它更像是不相等

标签: python pandas filtering


【解决方案1】:

您可以使用pandas.DataFrame.filter:

设置

df = pd.DataFrame(columns=['MLB', 'NBA', 'NHL', 'NFL', 'TESTNBA'])    
df_check = ['MLB', 'NBA']

df.filter(regex='|'.join(df_check)).columns

Index(['MLB', 'NBA', 'TESTNBA'], dtype='object')

【讨论】:

  • 我更喜欢将索引保留为索引,但无论哪种方式,您都可以使用索引的tolist() 方法而不是使用list 构造函数
  • 没错,使用tolist() 会更好。它得到了我的支持。
【解决方案2】:

in 运算符不能以矢量化方式工作。根据您的逻辑,您需要将any 与生成器表达式一起使用:

value_cols = [col for col in df.columns if any(i in col for i in df_check)]

更好的是,您可以将布尔索引与 str.contains 一起使用。这是一个演示:

df = pd.DataFrame(columns=['MLB1', 'NBA2', 'SOMEOTHERCOL', 'TESTNBA3', 'MLB4'])

df_check = ['MLB', 'NBA', 'TESTNBA']

value_cols = df.columns[df.columns.str.contains('|'.join(df_check))]

Index(['MLB1', 'NBA2', 'TESTNBA3', 'MLB4'], dtype='object')

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2017-07-31
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 2018-11-14
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多