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

2024-04-20 09:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,其中包含字符串格式的术语。这些术语分为两类:水果和载体。我试图显示一个只包含来自冲突类别的术语对的数据帧。最好的方法是什么?下面是我的列表和数据帧的示例。任何帮助都将不胜感激!你知道吗

  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']

Tags: 数据字符串apple列表格式col类别car
2条回答

从列表列创建DataFrame,按^{}测试成员身份,然后按~反转掩码,用^{}检查每行至少一个True的列表和最后一个链条件,按位和-&,按^{}过滤:

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]

可能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]

相关问题 更多 >