根据Pandas数据框中的列表比较列值

时间:2018-11-22 11:35:57

标签: pandas dataframe

我有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

2 个答案:

答案 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