给出这个数据示例,我想通过一列的合并信息而不是删除行来对行进行重复数据删除。在本例中是字段 CODE。
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
我接近解决方案但我无法达到它:
线索:
df.groupby('CODE')['ALT_NAME','NAME'].apply(list).reset_index()
但这不适用于多个列
最佳答案
使用:
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
但如果需要它添加 if-else
到 lambda 函数:
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
关于python - 合并来自python中重复记录的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513259/