【问题标题】:How do you output boolean if column containing lists have elements from another larger list?如果包含列表的列具有来自另一个更大列表的元素,您如何输出布尔值?
【发布时间】:2022-01-24 18:53:02
【问题描述】:

我有一列,其中每一行都包含一个不同长度的字符串列表。我需要创建一个新列,其中包含一个布尔列表(相当于原始列表),以确定每个元素是否在另一个(更大)列表中找到。

这就是我正在做的,很好,它显然不起作用。我基于这个问题: How to return list of booleans to see if elements of one list in another list

data = [
    [1, ["cat", "cat", "mouse"]],
    [2, ["dog", "horse"]],
    [3, ["cat"]],
    [
        4,
        np.nan,
    ],
]

df = pd.DataFrame(data, columns=["ID", "list"])
df

main_list = ["cat", "dog", "mouse", "pig", "cow"]

df["contains_item_from_list"] = df["list"].apply(
    (lambda x: [x in main_list for x in b])
)

想要的输出:

ID     list          contains_item_from_list
1  [cat,cat,mouse]      [True, True, True]
2  [dog,horse]          [True, False]
3  [cat]                [True]
4   NaN                 [False]

【问题讨论】:

    标签: python pandas list-comprehension


    【解决方案1】:

    您还可以应用一个迭代list 中每个列表的函数。这应该比爆炸列更快:

    main_set = set(main_list)
    df["contains_item_from_list"] = df['list'].apply(lambda x: [w in main_set for w in x] if isinstance(x, list) else [x in main_set])
    

    输出:

       ID               list contains_item_from_list
    0   1  [cat, cat, mouse]      [True, True, True]
    1   2       [dog, horse]           [True, False]
    2   3              [cat]                  [True]
    3   4                NaN                 [False]
    

    【讨论】:

      【解决方案2】:

      explode 将系列中的所有列表展平,但同一列表中的项目都共享与它们来自的列表相同的索引,因此在您使用 isin 后检查 main_list 的哪些项目在系列中,您可以使用groupbylevel=0 按索引的第0(第一)级分组,然后将它们转换回列表:

      df['contains_item_from_list'] = df['list'].explode().isin(main_list).groupby(level=0).apply(list)
      

      输出:

      >>> df
      0    [True, True, True]
      1         [True, False]
      2                [True]
      3               [False]
      Name: list, dtype: object
      

      【讨论】:

        【解决方案3】:

        你可以先explode 然后isin

        df['new'] = df['list'].explode().isin(main_list).groupby(level=0).any()
        df
        Out[130]: 
           ID               list    new
        0   1  [cat, cat, mouse]   True
        1   2       [dog, horse]   True
        2   3              [cat]   True
        3   4                NaN  False
        

        更新

        df['new'] = df['list'].explode().isin(main_list).groupby(level=0).agg(list)
        df
        Out[132]: 
           ID               list                 new
        0   1  [cat, cat, mouse]  [True, True, True]
        1   2       [dog, horse]       [True, False]
        2   3              [cat]              [True]
        3   4                NaN             [False]
        

        【讨论】:

          【解决方案4】:

          使用列表理解,简单快捷

          df["contains_item_from_list"]= df['list'].fillna('xx').apply(lambda x: [val in main_list for val in x])
          
              ID            list     contains_item_from_list
          0   1  [cat, cat, mouse]      [True, True, True]
          1   2       [dog, horse]           [True, False]
          2   3              [cat]                  [True]
          3   4                NaN                  [False]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-09
            • 1970-01-01
            • 1970-01-01
            • 2014-03-09
            • 2021-03-02
            • 2022-01-18
            • 2018-04-19
            相关资源
            最近更新 更多