过滤包含列表所有元素的Pandas DF



我有一个包含许多列的数据框架。其中一列("BLOCKED_YES")包含国家代码字符串,例如:"ca ch hk eu UK de"。国家代码可以是随机顺序。

我想隔离包含禁令列表中所有元素的所有行。例如,如果ban list = ['CA','US'],我想捕获所有在BLOCKED_YES列中同时存在这两个元素的df行(无论顺序如何)。

我目前有以下

df = df[['STATUS','BLOCKED_YES','NAME']]
ban_list= ['US','CA']
df2 = df[df['BLOCKED_YES'].isin(ban_list)]

在上面的情况下,我得到一个df,其中BLOCKED_YES列包含ban_list中任何元素的字符串,我想要包含列表中所有元素的行,而不仅仅是一个。

我认为你最好使用sets而不是列表,因为集合在概念上是无序的。

让我们假设您的原始数据是:

import pandas as pd
df = pd.DataFrame([
(1, 'CA CH HK EU UK DE'),
(2, 'CA CH HK EU UK DE US')
], columns=['id', 'countries'])

你的禁令列表实际上是一个集合,而不是一个列表:

ban_list= {'US','CA'}

你可以把每个单元格的内容也变成一个集合,像这样:

df['countries'].str.split(' ').apply(set)

,然后使用set.issubset检查是否所有元素都在(即,如果禁止列表是每个条目的子集)。与apply串联在一起,可以非常简洁:

df[df['countries'].str.split(' ').apply(set).apply(ban_list.issubset)]

最新更新