将具有相同ID的行分组,pandas / python

时间:2019-10-01 11:29:19

标签: python pandas csv dataframe pandas-groupby

这是原始数据集

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

如果最新值是错误的值,我需要将冲突值存储到新列中以进行后续清理吗?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

如果您的update_date列升序排列。而且您的空白单元格是实际的空格,请使用replaceffilldrop_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')