这是原始数据集
id firstname lastname email update date
A1 wendy smith ws@mail.com 2018-01-02
A1 wendy smith smith@mail.com 2019-02-03
A2 harry lynn lynn@mail.com 2016-04-03
A2 harry harylynn@mail.com 2019-03-12
A3 tinna dickey tinna@mail.com 2016-04-03
A3 tinna dickey 776-3384-333 2019-03-12
我的设计是对具有相同ID的行进行分组,如果某些具有相同ID的列包含不同的值,请保留最新的值。 所以结果应该是这样的:
id firstname lastname email update date
A1 wendy smith smith@mail.com 2019-02-03
A2 harry lynn harylynn@mail.com 2019-03-12
A3 tinna dickey tinna@mail.com 2019-03-12
当前,我尝试使用pandas groupby对具有相同值的单元格进行分组,并在一个单元格中将不同的值保持在“,”之间,以备后用(删除早期数据,使一个单元格成为一个数据)。没错,我想我在做什么是不对的...
df=df.groupby(['id']).agg({'first_name': lambda x:','.join(set(x))})
如果最新值是错误的值,我需要将冲突值存储到新列中以进行后续清理吗?
任何帮助将不胜感激!
答案 0 :(得分:2)
如果您的update_date
列升序排列。而且您的空白单元格是实际的空格,请使用replace
,ffill
和drop_duplicates
df_new = df.replace('', np.NaN).ffill().drop_duplicates('id', keep='last')
如果您的空白单元格为NaN
,请使用:
df_new = df.ffill().drop_duplicates('id', keep='last')
输出
id firstname lastname email update date
1 A1 wendy smith smith@mail.com 2019-02-03
3 A2 harry lynn harylynn@mail.com 2019-03-12
如果您的数据未排序,请首先执行以下操作:
df = df.sort_values(['id', 'update date'])
答案 1 :(得分:1)
我认为这会解决
output = df.drop_duplicates(subset=["id"], keep='last')