Python 字典:将排序后的数据框列映射到字典的问题

-2 投票
1 回答
39 浏览
提问于 2025-04-13 19:21

有人能帮我理解一下为什么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')

撰写回答