过滤 Pandas 个包含列表所有元素的 DF
Filtering Pandas DF Containing All Elements of a List
我有一个包含多列的数据框。其中一列 ("BLOCKED_YES") 包含国家代码字符串,例如'CA CH HK EU UK DE'。国家代码可以随机排列。
我想隔离包含禁止列表所有元素的所有行。例如,如果禁令列表 = ['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
而不是列表,因为集合从概念上讲是无序的。
假设您的原始数据是:
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
to check if all elements are in (i.e. if the ban list is a subset of each entry). Chained together with apply
,可以很简洁:
df[df['countries'].str.split(' ').apply(set).apply(ban_list.issubset)]
我有一个包含多列的数据框。其中一列 ("BLOCKED_YES") 包含国家代码字符串,例如'CA CH HK EU UK DE'。国家代码可以随机排列。
我想隔离包含禁止列表所有元素的所有行。例如,如果禁令列表 = ['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
而不是列表,因为集合从概念上讲是无序的。
假设您的原始数据是:
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
to check if all elements are in (i.e. if the ban list is a subset of each entry). Chained together with apply
,可以很简洁:
df[df['countries'].str.split(' ').apply(set).apply(ban_list.issubset)]