Python 字典:将排序后的数据框列映射到字典的问题
有人能帮我理解一下为什么Python字典会保留原始数据的顺序,而不是按照排序后的数据来吗?
举个例子,这里有一个数据框(df):
Id Date
0 AB001 12-03-2020
1 AB002 14-08-2023
2 AB003 16-08-2017
3 AB001 23-12-2023
当我把“日期”这一列从最新到最旧排序时:
df.sort_values(['Date'],ascending=[False],inplace=True)
Id Date
1 AB001 2023-12-23
3 AB002 2023-08-14
0 AB001 2020-03-12
2 AB003 2017-08-16
然后我用下面的代码进行映射:
date_dict = dict(zip(df['Id'], df['Date']))
当我打印键ABOO1
的值时,输出是2020-03-12
,而不是2023-12-23
。
这是为什么呢?
1 个回答
0
如果你想要最新的日期,可以使用 groupby.max
这个方法:
date_dict = df.groupby('Id')['Date'].max().to_dict()
输出结果:
{'AB001': '2023-12-23', 'AB002': '2023-08-14', 'AB003': '2017-08-16'}
这个方法比起排序只保留一个值要更有效率。你也可以通过升序排序来得到这个值(用 zip 创建字典时会保留最后出现的值):
df.sort_values(by='Date', inplace=True)
date_dict = dict(zip(df['Id'], df['Date']))
输出结果:
{'AB003': '2017-08-16', 'AB001': '2023-12-23', 'AB002': '2023-08-14'}
不过要注意,键的顺序是不同的。
另外,要把你原来的日期格式从 DD-MM-YYYY
转换过来:
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True).dt.strftime('%Y-%m-%d')