使用all()比较带有字符串列表的两个数据框列



我正在处理一个具有两列字符串列表的数据框架,我需要知道列表的所有元素是否包含在另一个列表中。

最初我的值是字符串,这里有一个例子:

df1
num
0     [10 2]
1     [120]
2     [2 5 8]
df2
num
0     [10 2]
1     [60]
2     [2 5]

然后我使用df1['num'].str.split()将字符串中的元素放入列表中:

df1
num
0     [10, 2]
1     [120]
2     [2, 5, 8]

之后,我尝试使用all(item in df1['num'].str.split() for item in df2['num'].str.split())但是它输出:

TypeError: unhashable type: 'list'

期望的输出是:

0     True
1     False
2     True

我该怎么做?

import pandas as pd
df1 = pd.DataFrame({
'num': [['10', '2'], ['120'], ['2', '5', '8']]
})
df2 = pd.DataFrame({
'num': [['10', '2'], ['60'], ['2', '5']]
})
df1_str = pd.DataFrame(df1['num'].str)
df2_str = pd.DataFrame(df2['num'].str)
lst = [all(df2_str[col].isin(df1_str[col])) for col in df2_str.columns]
print(lst)

使用issubset方法将值从df1['num']转换为sets:

df1['new'] = [set(b).issubset(a) for a,b in zip(df1['num'], df2['num'])]
print (df1)
num    new
0    [10, 2]   True
1      [120]  False
2  [2, 5, 8]   True

如果值没有被分割,修改解:

df1['test'] = [set(b.split()).issubset(a.split()) for a,b in zip(df1['num'], df2['num'])]

可以在这里使用set操作:

pd.Series([set(a)>=set(b) for a,b in zip(df1['num'], df2['num'])], index=df1.index)

输出:

0     True
1    False
2     True
dtype: bool

或者赋值给其中一个数据帧:

df1['test'] = [set(a)>=set(b) for a,b in zip(df1['num'], df2['num'])]

输出:

num   test
0    [10, 2]   True
1      [120]  False
2  [2, 5, 8]   True

最新更新