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

将具有相同id的行分组,pandas/python,python,pandas,csv,dataframe,pandas-groupby,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

这是原始数据集

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))})
如果最新的值是错误的值,我是否需要将冲突值存储到新列中以供后续清理


任何帮助都将不胜感激

我认为这会解决问题

output = df.drop_duplicates(subset=["id"], keep='last')

如果您的
update\u date
列按升序排序。如果您的空单元格是实际的空白,请使用
replace
ffill
drop\u 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'])

lastname
中的单元格实际上是空的还是
NaN
?这可能是用户忘记键入他们的姓氏注意:OP可能需要使用
sort_值
来确保“latest”值确实是Last谢谢您的回复,因为一些早期数据可能包含最新数据没有的值,就像第四行中的“harry”没有姓一样,我需要从前面一行中获取值。因此,在排序后删除日期可能无法解决此类问题。感谢您的回复!我不知道,那会有帮助的。例如,如果最新的电子邮件值是一个错误的值,比如人们不小心将电话号码留在了这个手机中,该怎么办。我是否需要将重复的电子邮件保存在另一列中以供后面的比较?老实说,这使得问题完全不同,因为您现在必须使用
regex
。我看你原来的问题已经回答了。请随时发布另一个问题和第二个问题。