如何按date与id合并两个DataFrame并生成按日期有序的结果?
解决方案
要实现需求,只需通过拼接DataFrame + 转换日期格式 + 排序三步即可完成,具体代码及说明如下:
示例代码
import pandas as pd # 模拟用户提供的两个DataFrame df_1 = pd.DataFrame({ 'date': ['2019-05', '2019-06', '2019-07', '2019-08', '2019-05', '2019-06', '2019-07', '2019-08', '2019-05', '2019-06', '2019-07', '2019-08'], 'id': [5,5,5,5,2,2,2,2,70,70,70,70], 'score': [78.9,77.5,80.2,82.0,79.9,69.3,75.2,80.0,68.8,67.5,70.2,86.0] }) df_2 = pd.DataFrame({ 'date': ['2019-01', '2019-02', '2019-03', '2019-04', '2019-01', '2019-02', '2019-03', '2019-04', '2019-01', '2019-02', '2019-03', '2019-04'], 'id': [2,2,2,2,5,5,5,5,70,70,70,70], 'score': [79.1,79.2,75.2,80.0,78.9,78.5,80.8,82.8,68.4,72.2,70.5,81.0] }) # 1. 拼接两个结构一致的DataFrame combined_df = pd.concat([df_1, df_2]) # 2. 将date列转为日期类型,避免字符串排序的逻辑错误 combined_df['date'] = pd.to_datetime(combined_df['date']) # 3. 按id升序分组,每组内按date升序排列 result_df = combined_df.sort_values(by=['id', 'date'], ascending=[True, True]) # 4. 重置索引,让结果索引连续整洁(可选) result_df = result_df.reset_index(drop=True) # 输出结果 print(result_df)
步骤说明
- 拼接DataFrame:用
pd.concat()将两个列结构完全相同的数据集上下合并,得到完整的原始数据。 - 转换日期格式:把
date列从字符串转为datetime类型,确保后续排序是按真实日期顺序,而非字符串字典序(比如避免"2019-10"排在"2019-05"前面的错误)。 - 排序:通过
sort_values()指定排序规则,先按id分组排序,再在每个id组内按date升序排列。 - 重置索引:排序后原索引会混乱,用
reset_index(drop=True)重新生成连续索引,让结果更规范。
最终输出
执行代码后会得到符合要求的结果:
date id score 0 2019-01-01 2 79.1 1 2019-02-01 2 79.2 2 2019-03-01 2 75.2 3 2019-04-01 2 80.0 4 2019-05-01 2 79.9 5 2019-06-01 2 69.3 6 2019-07-01 2 75.2 7 2019-08-01 2 80.0 8 2019-01-01 5 78.9 9 2019-02-01 5 78.5 10 2019-03-01 5 80.8 11 2019-04-01 5 82.8 12 2019-05-01 5 78.9 13 2019-06-01 5 77.5 14 2019-07-01 5 80.2 15 2019-08-01 5 82.0 16 2019-01-01 70 68.4 17 2019-02-01 70 72.2 18 2019-03-01 70 70.5 19 2019-04-01 70 81.0 20 2019-05-01 70 68.8 21 2019-06-01 70 67.5 22 2019-07-01 70 70.2 23 2019-08-01 70 86.0
内容的提问来源于stack exchange,提问作者zhlee
相关产品推荐
相关产品推荐

