我正在处理一个具有两列字符串列表的数据框架,我需要知道列表的所有元素是否包含在另一个列表中。
最初我的值是字符串,这里有一个例子:
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']
转换为set
s:
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