Выберите строки с одинаковыми значениями в одном столбце, но с другим значением в другом столбце - PullRequest
1 голос
/ 10 апреля 2019

В моих данных есть дубликаты, которые мне нужно исправить.

Это образец кадра данных:

    test = pd.DataFrame({'event_id':['1','1','2','3','5','6','9','3','9','10'],
                 'user_id':[0,0,0,1,1,3,3,4,4,4],
                 'index':[10,20,30,40,50,60,70,80,90,100]})

Мне нужно выбрать все строки, которые имеют одинаковые значения в event_id, но разные значения в user_id. Я попытался это (на основе аналогичного вопроса, но без принятого ответа):

test.groupby('event_id').filter(lambda g: len(g) > 1).drop_duplicates(subset=['event_id', 'user_id'], keep="first")

out:

    event_id    user_id index
0   1           0       10
3   3           1       40
6   9           3       70
7   3           4       80
8   9           4       90

Но мне не нужна первая строка, где user_id совпадает - 0.

Вторая часть вопроса - каков наилучший способ исправить дубликат записи? Как я могу добавить суффикс к event_id (_new), но только в этой строке:

    event_id    user_id index
3   3_new       1       40
6   9_new       3       70
7   3           4       80
8   9           4       90

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Ммм, я пытаюсь исправить ваш код

test.groupby('event_id').
      filter(lambda x : (len(x['event_id'])==x['user_id'].nunique())&(len(x['event_id'])>1))
Out[85]: 
  event_id  user_id  index
3        3        1     40
6        9        3     70
7        3        4     80
8        9        4     90

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

df['subkey']=df.groupby('event_id').cumcount()
1 голос
/ 10 апреля 2019

Попробуйте:

test[test.duplicated(['event_id'], keep=False) & 
     ~test.duplicated(['event_id','user_id'], keep=False)]

Выход:

  event_id  user_id  index
3        3        1     40
6        9        3     70
7        3        4     80
8        9        4     90
...