从一列中具有相同值但另一列中具有不同值的行中选择

时间:2019-04-10 18:11:29

标签: python-3.x pandas duplicates

我的数据中有一些重复项需要更正。

这是一个数据框的示例:

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

答案 0 :(得分:1)

尝试:

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

答案 1 :(得分:1)

嗯,我尝试修正您的代码

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()