将具有相同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
。我看你原来的问题已经回答了。请随时发布另一个问题和第二个问题。