我有一个包含许多列的数据框架。其中一列("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中任何元素的字符串,我想要包含列表中所有元素的行,而不仅仅是一个。
我认为你最好使用set
s而不是列表,因为集合在概念上是无序的。
让我们假设您的原始数据是:
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)]