合并来自python中重复记录的信息

时间:2018-07-25 07:33:07

标签: python pandas duplicates

给出此数据示例,我想通过合并信息(每一列)而不是删除行来对行进行重复数据删除。在这种情况下,将是“ CODE”字段。

spamreader

输出:

df = pd.DataFrame({'CODE':['000', '111','111','222','222', '333'],'NAME':['help','foo','bar', 'bla','booo','nyaa']  ,'ALT_NAME':['zzz','foo 1','bar', 'bl','bo','rrr'] })
print(df)

结果将是:

    ALT_NAME    CODE    NAME
0   zzz         000     help
1   foo 1       111     foo
2   bar         111     bar
3   bl          222     bla
4   bo          222     booo
5   rrr         333     nyaa

我靠近解决方案,但我无法达到它:

线索:

    ALT_NAME        CODE            NAME
0   zzz             000             help
1   [foo 1, bar]    [111,111]       [foo,bar]
2   [bl,bo]         [222,222]       [bla,boo]
3   rrr             333             nyaa

但这不适用于几列

2 个答案:

答案 0 :(得分:2)

使用:

df = pd.DataFrame({'CODE':['000', '111','111','222','222', '333'],'NAME':['help','foo','bar', 'bla','booo','nyaa']  ,'ALT_NAME':['zzz','foo 1','bar', 'bl','bo','rrr'] })
print (df)

输出:

  ALT_NAME CODE  NAME
0      zzz  000  help
1    foo 1  111   foo
2      bar  111   bar
3       bl  222   bla
4       bo  222  booo
5      rrr  333  nyaa

我认为更好的方法是创建DataFrameGroupBy.agg的所有值列表,但首先使用reset_index按列创建index

df1 = (df.set_index('CODE', drop=False)
         .rename_axis(None)
         .groupby('CODE')
         .agg(list)
         .reset_index(drop=True))
print (df1)

输出:

       ALT_NAME         NAME
0           zzz         help
1  [foo 1, bar]   [foo, bar]
2      [bl, bo]  [bla, booo]
3           rrr         nyaa

但是如果需要,可以在lambda函数中添加if-else

df1 = (df.set_index('CODE', drop=False)
         .rename_axis(None)
         .groupby(level=0)
         .agg(lambda x: list(x) if len(x) > 1 else x)
         .reset_index(drop=True))
print (df1)

输出:

       ALT_NAME        CODE         NAME
0           zzz         000         help
1  [foo 1, bar]  [111, 111]   [foo, bar]
2      [bl, bo]  [222, 222]  [bla, booo]
3           rrr         333         nyaa

答案 1 :(得分:2)

我认为这对您有效,aggaggregate的别名,它应用于组的每一列:

 df.groupby(['CODE']).agg(lambda x:list(x))

顺便说一句,有人知道为什么我在运行df.groupby(['CODE']).agg(list)时失败了吗?