Как проверить, есть ли у группы панда данных одинаковые данные - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть датафрейм панд, как показано ниже

id  name  Base   field1    field2           field3
1   AA     Y      Yes      Consumer         Not Applicable 
1   BB     N      Yes      Consumer         Not Applicable 
2   CC     Y      Yes      Consumer         Not Applicable 
2   DD     N      Yes      Not Applicable   Not Applicable 
2   EE     N      No       Not Applicable   Modified
3   FF     Y      Yes      Not Applicable   Applicable 
3   GG     N      Yes      Not Applicable   Not Applicable 
3   HH     N      Yes      Not Applicable   Not Applicable 

Ожидаемый результат - сгруппировать этот кадр данных на основе столбца ID и проверить, совпадают ли данные во всех других столбцах с данными в каждой группе, и, наконец, записать результаты.

Я пытался это проверить данные по каждой группе, но он всегда говорит ИСТИНА

Код:

result_list=[]
for col in df.columns:
        result = df.groupby(level=0)[col].apply(lambda x: len(set(x))==1)
        result_list.append(result)

final = pd.concat(result_list,1)

Ожидаемый результат:

id  name     field1   field2           field3           Error
1   AA       Yes      Consumer         Not Applicable   Pass 
1   BB       Yes      Consumer         Not Applicable   Pass
2   CC       Yes      Consumer         Not Applicable   field1, field2, field3 mismatch for ID: 2
2   DD       Yes      Not Applicable   Not Applicable   field1, field2, field3 mismatch for ID: 2
2   EE       No       Not Applicable   Modified         field1, field2, field3 mismatch for ID: 2
3   FF       Yes      Not Applicable   Applicable       field3 mismatch for ID: 3
3   GG       Yes      Not Applicable   Not Applicable   field3 mismatch for ID: 3
3   HH       Yes      Not Applicable   Not Applicable   field3 mismatch for ID: 3

Любая помощь в этом?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете groupby id, а затем agg в каждом столбце, вычисляя количество unique значений на группу, и тогда вы знаете, что существует ошибка, когда это число больше 1:

df[df.columns.drop('name')].groupby('id').agg(lambda x: len(x.unique()))>1

С этим выводом, на основе которого вы можете построить свою строку.

    field1  field2  field3
id          
1   False   False   False
2   True    True    True
3   False   False   True
0 голосов
/ 13 ноября 2018

Вы можете получить то, что вы хотите с кодом (при условии, что df имеет индекс с именем id):

def handler(df):
    for col in ['field1', 'field2', 'field3']:
        if df.loc[:, col].nunique() > 1:
            return 'error in {} for id {}'.format(col, df.index[0])
    else:
        return 'pass'

result = df.groupby(level=0).apply(handler)
result = df.reset_index().merge(result.to_frame().reset_index(), on='id')

result:

   id name field1          field2          field3                         0
0   1   AA    Yes        Consumer  Not Applicable                      pass
1   1   BB    Yes        Consumer  Not Applicable                      pass
2   2   CC    Yes        Consumer  Not Applicable  error in field1 for id 2
3   2   DD    Yes  Not Applicable  Not Applicable  error in field1 for id 2
4   2   EE     No  Not Applicable        Modified  error in field1 for id 2
5   3   FF    Yes  Not Applicable      Applicable  error in field3 for id 3
6   3   GG    Yes  Not Applicable  Not Applicable  error in field3 for id 3
7   3   HH    Yes  Not Applicable  Not Applicable  error in field3 for id 3

РЕДАКТИРОВАТЬ - небольшие выпуски в обработчике

def handler(df):
    cols = list()
    for col in ['field1', 'field2', 'field3']:
        if df.loc[:, col].nunique() > 1:
            cols.append(col)
    if cols:
        return 'error in {} for id {}'.format(', '.join(cols), df.index[0])
    else:
        return 'pass'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...