Сравнить значения столбцов на основе списка в кадре данных Pandas - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть 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 равно list1, то соответствующие данные «значения» в df1 должны быть одним из значений столбца list1 в df2 3.

-> Если значение списка в df1 равно list2, то соответствующие данные «значения» в df1 должны быть равны одному из значений столбца list2 в df2.

Ожидаемый результат 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 голосов
/ 22 ноября 2018

Вы можете сделать следующее:

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
0 голосов
/ 22 ноября 2018

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...