检查两个列表是否在一个Pandas列中

3

我有两个包含字符串格式术语的列表。这些术语属于两个类别:水果和车辆。我想显示一个仅包含来自冲突类别的术语对的数据框架。最好的方法是什么?下面是我的列表和数据框架的示例。任何帮助都将不胜感激!

  dataframe:

         col 1                 
  ['apple', 'truck' ]
  ['truck', 'orange']
  ['pear',  'motorcycle']
  ['pear', 'orange' ]
  ['apple', 'pear'  ]
  ['truck', 'car'   ]


  vehicles = ['car', 'truck', 'motorcycle']
  fruits = ['apple', 'orange', 'pear']


  desired output:

        col 2

  ['apple', 'truck' ]
  ['pear', 'motorcycle']
  ['truck', 'orange']

你目前尝试了什么? - Niels Henkens
2个回答

5

从列表列创建DataFrame,通过DataFrame.isin测试成员身份,然后通过~反转掩码,在每行中检查至少一个True,使用DataFrame.any对列表和最后链条件进行按位AND运算 - &,并通过布尔索引进行过滤:

df1 = pd.DataFrame(df['col 1'].values.tolist())
df = df[(~df1.isin(vehicles)).any(axis=1) & (~df1.isin(fruits)).any(axis=1)]
print (df)
                col 1
0      [apple, truck]
1     [truck, orange]
2  [pear, motorcycle]

另一种解决方案是使用由and链接的set的交集(因为标量),并转换为bool - 空集将被转换为False

def func(x):
    s = set(x)
    v = set(vehicles)
    f = set(fruits)
    return bool((s & v) and (s & f))

df = df[df['col 1'].apply(func)]
print (df)
                col 1
0      [apple, truck]
1     [truck, orange]
2  [pear, motorcycle]

0

也许 np.isin 对你有用!

super_set = np.array([vehicles,fruits])

def f(x):
    return all(np.isin(super_set,x).sum(axis=1))

df[df.col1.apply(f)]

#
col1
0   [apple, truck]
1   [truck, orange]
2   [pear, motorcycle]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接