Проверка недопустимых копий по группам Python - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу проверить не дубликаты в группах и вернуть все эти дубликаты, но только когда эти ключи отображаются несколько раз. Например,

Var  Code   Description
1    A      ABC
2    B      EF
1    A      ABCD
2    B      EF
1    B      ABC
3    C      DD

Я ожидаю получить некоторый результат, подобный этому

Var  Code Description
1    A    ABC
1    A    ABCD

Причина, по которой я хочу, чтобы эта таблица состояла в том, чтобы определить, какая пара (var, code) имеет множественное описание, потому что в моем случае, если оно имеет множественное описание, это означает, что описание этих пар должно быть изменено, чтобы быть уникальным.

Эта таблица возвращает строки, которые имеют одинаковое имя переменной и одинаковое кодовое имя, но разное описание. Потому что для моих данных код переменной должен иметь только одно описание вместо нескольких описаний.

3 C DD не возвращается, потому что существует только одна запись о (3, C) паре, и DD является единственным описанием этой пары.

2 B EF не возвращается, потому что, хотя две строки содержат пару (2, B), они имеют одинаковое описание, которое является нормальным.

1 B ABC не возвращается, потому что хотя var 1 показывает три раза, но (1, B) пара показывает только один раз и имеет только одно описание ABC.

Какие-нибудь решения?

Спасибо!

Ответы [ 2 ]

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

Вы можете использовать groupby и фильтровать строки, используя nunique

new_df = df.groupby(['Var', 'Code']).filter(lambda x: x['Description'].nunique() > 1) 

    Var Code    Description
0   1   A       ABC
2   1   A       ABCD
0 голосов
/ 20 ноября 2018
msk1 = df.duplicated(subset=['Code', 'Var'], keep=False)
msk2 = df.duplicated(subset=['Code', 'Var', 'Description'], keep=False)
msk3 = msk1 & ~msk2
df[msk3]

# msk1 filters to all rows where both Var and Code are duplicated
print(df[msk1])
Var  Code Description
1    A    ABC
1    A    ABCD
2    B    EF
2    B    EF

# msk2 further filters to where Var Code and Description are duplicated 
print(df[msk2])
Var Code Description 
2   B    EF
2   B    EF

# so then finally msk3 is msk1 without msk2 
# give me all rows where Var and Code are duplicated 
# except for the ones where the Description is also duplicated
# - the desired result 
print(df[msk3])
Var  Code Description
1    A    ABC
1    A    ABCD
...