【问题标题】:Pandas dataframe selection based on content of list object in dataframe基于数据框中列表对象内容的 Pandas 数据框选择
【发布时间】:2020-04-15 14:59:24
【问题描述】:

我有一个 pandas 数据框,其中一列包含列表对象,这给了我dtype: object. 列表对象的长度不同。

        features           other_features
0        ["foo", "bar"]                2
1        ["foo", "dog"]                1
2        ["dog"]                       4

我想在我的数据框中选择列表中包含不同列表 external_list = ["dog", "cat"] 中的元素的行。

在这种情况下,我希望结果是包含 dog 或 cat 以及其他列的行,这将是:

        features           other_features
1        ["foo", "dog"]                1
2        ["dog"]                       4

我尝试过 isin,但据我了解,它要求要查看的元素的列类型不是多个对象的列表。

filter = df["features"].isin(["dog", "cat"])

它会导致每个元素都为 False,它不应该是因为有些应该是 True,并且它不会返回其余的列。

我该如何解决这个问题?

【问题讨论】:

    标签: python pandas dataframe selection


    【解决方案1】:

    使用map 将比较列表转换为isdisjoint 测试的集合,~ 用于反向掩码:

    #if string repr of list
    #import ast
    #df['features'] = df['features'].apply(ast.literal_eval)
    
    external_list = ["dog", "cat"]
    df = df[~df.features.map(set(external_list).isdisjoint)]
    print (df)
         features  other_features
    1  [foo, dog]               1
    2       [dog]               4
    

    【讨论】:

    • 谢谢!起初结果数据框是空的,使用literal_eval的cmets解决了它,它给了我想要的东西。
    【解决方案2】:

    让我们在axis =0上“爆炸”,然后我们可以做isin

    m=pd.DataFrame(df.features.tolist(),index=df.index).isin(external_list).any(1)
    df=df[~m]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多