我有2个数据框,如下所示:
df1:
ID list value listA valueA listB valueB
1 list1 D1 list1 D1 list1 D1
2 list2 D1
3 list1 D3 list2 D3
4 list2 D1 list2 D1 list1 D3
5 list2 D2 list2 D2 list2 D2
6 list2 D3 list1 D3 list1 D4
df2:
list1 list2
D1 456
D2 D2
33 D31
D4 245
EE D5
D5 D6
我正在尝试根据以下验证结果生成最终的df
->如果df1中list的值是list1,则df1中“ value”的对应数据应该是df2 3中list1列的值之一。
->如果df1中list的值是list2,则df1中“ value”的对应数据应该是df2中list2列的值之一。
预期结果df:
ID list value listA valueA listB valueB Error
1 list1 D1 list1 D1 list1 D1 no mismatch
2 list2 D1 valueA mismatch
3 list1 D3 list2 D3 value, valueB mismatch
4 list2 D1 list2 D1 list1 D3 value,valueA&valueB mismatch
5 list2 D2 list2 D2 list2 D2 no mismatch
6 list2 D3 list1 D3 list1 D4 value, valueA mismatch
答案 0 :(得分:0)
将GroupBy.transform
与具有isin
的自定义功能一起使用,以布尔掩码表示,并通过numpy.where
设置值:
m = df1.groupby('list')['value'].transform(lambda x: x.isin(df2[x.name]))
df1['Error'] = np.where(m, 'No mismatch with df2','list mismatch with df2')
print (df1)
ID list value Error
0 1 list1 D1 No mismatch with df2
1 2 list1 D2 No mismatch with df2
2 3 list1 D3 list mismatch with df2
3 4 list2 D1 list mismatch with df2
4 5 list2 D2 No mismatch with df2
5 6 list2 D3 list mismatch with df2
答案 1 :(得分:0)
您可以执行以下操作:
def fun(x, df2):
if x['value'] not in df2[x['list']].tolist():
return 'list mismatch with df2'
else:
return 'No mismatch with df2'
df['Error'] = df.apply(lambda x: fun(x, df2), axis = 1)
print(df)
ID list value Error
0 1 list1 D1 No mismatch with df2
1 2 list1 D2 No mismatch with df2
2 3 list1 D3 list mismatch with df2
3 4 list2 D1 list mismatch with df2
4 5 list2 D2 No mismatch with df2
5 6 list2 D3 list mismatch with df2