给出此数据示例,我想通过合并信息(每一列)而不是删除行来对行进行重复数据删除。在这种情况下,将是“ 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
但这不适用于几列
答案 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)
我认为这对您有效,agg
是aggregate
的别名,它应用于组的每一列:
df.groupby(['CODE']).agg(lambda x:list(x))
顺便说一句,有人知道为什么我在运行df.groupby(['CODE']).agg(list)
时失败了吗?