【问题标题】:How to filter pandas rows based on if column values are substring of a given string?如何根据列值是否是给定字符串的子字符串来过滤熊猫行?
【发布时间】:2021-01-14 19:04:36
【问题描述】:

我有一个数据框 df,其中有一列 A。 有一个给定的字符串s

我想用在A 中具有列值的行对数据框进行子集化,这些行是 给定字符串s。 如果我想反过来,我会做类似df[df['A'].contains(s)] 的事情。 但我想过滤掉sdf['A'] 中值的超字符串的行。 我无法找到答案,因此如果存在重复问题,请提前道歉。

【问题讨论】:

    标签: python pandas string dataframe series


    【解决方案1】:

    我认为你不能比列表理解做得更好:

    df[[x in s for x in df.A]]
    

    但是,如果 df.A 是重复的(例如分类),那么您可以对其进行优化

    key, unique_vals = pd.factorize(df.A)
    mask = np.asarray([x in s for x in unique_vals])
    df.loc[mask[key]]
    

    或者如果df.A 是一个分类

    key, unique_vals = df.A.cat.codes, df.A.cat.categories
    mask = np.asarray([x in s for x in unique_vals])
    df.loc[mask[key]]
    

    【讨论】:

      【解决方案2】:

      我创建了一个示例:

      s = 'sas'
      df = pd.DataFrame(data={'A':['s', 'a', 'sa', 'da']})
      

      解决办法是:

      filtered_df = df[[s.find(i)!=-1 for i in df['A'].values]]
      

      这不是熊猫的方式,但它有效。我希望它会有所帮助。

      输出:

          A
      0   s
      1   a
      2  sa
      

      UPD:如果您不想在 s==i 处添加行,您可以修改此代码,如下所示:

      df[[((s.find(i)!=-1) and (s!=i)) for i in df['A'].values]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-04
        • 2021-09-21
        • 2019-08-22
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 2023-03-14
        • 2015-09-24
        相关资源
        最近更新 更多