如果数据框内列表上的任何值在另一个列表中,则对熊猫数据框行进行过滤

Ary*_*azz 5 python python-2.7 pandas

我有一个pandas dataframe包含列split_categories中的列表:

df.head()

      album_id categories split_categories
    0    66562    480.494       [480, 494]
    1   114582        128            [128]
    2     4846          5              [5]
    3     1709          9              [9]
    4    59239    105.104       [105, 104]
Run Code Online (Sandbox Code Playgroud)

我想选择所有行,其中至少一个类别在特定列表中[480,9,104]。

预期产量:

  album_id categories split_categories
0    66562    480.494       [480, 494]
3     1709          9              [9]
4    59239    105.104       [105, 104]
Run Code Online (Sandbox Code Playgroud)

我设法做到这一点apply

def match_categories(row):
    selected_categories =  [480, 9, 104]
    result = [int(i) for i in row['split_categories'] if i in selected_categories]
    return result

df['matched_categories'] = df.apply(match_categories, axis=1)
Run Code Online (Sandbox Code Playgroud)

但是这段代码在生产环境中运行,并且这种方式花费的时间太长(我在包含列表的多列中运行它)

有没有办法运行类似的东西:

df[~(df['split_categories'].anyvalue.isin([480, 9, 104]))]
Run Code Online (Sandbox Code Playgroud)

谢谢

yat*_*atu 2

您可以展开内部列表,并检查any内部列表中的项目是否包含在[480, 9, 104]

l = [480, 9, 104]
df[df.categories.str.split('.', expand=True).isin(map(str,l)).any(axis=1)]

   album_id  categories split_categories
0     66562     480.494        [480,494]
3      1709       9.000              [9]
4     59239     105.104        [105,104]
Run Code Online (Sandbox Code Playgroud)