如何合并Python DataFrame中的对角日期数据?
问题描述
我是Python新手,若表述不清或暂未提供部分解决方案,敬请谅解。
我有如下DataFrame:包含Key、若干日期(分布在不同行),以及其他多列(同一Key对应的值相同)。
| Key | Date 1 | Date 2 | Date 3 | Column X | Column Y |
|---|---|---|---|---|---|
| Key 1 | 2022-01-01 | X11111111 | Y11111111 | ||
| Key 1 | 2022-01-02 | X11111111 | Y11111111 | ||
| Key 1 | 2022-01-03 | X11111111 | Y11111111 | ||
| Key 2 | 2022-12-01 | X22222222 | Y22222222 | ||
| Key 2 | 2022-12-02 | X22222222 | Y22222222 | ||
| Key 2 | 2022-12-03 | X22222222 | Y22222222 |
我希望将其聚合为如下形式:日期列补全对应值,其他列保持不变。
| Key | Date 1 | Date 2 | Date 3 | Column X | Column Y |
|---|---|---|---|---|---|
| Key 1 | 2022-01-01 | 2022-01-02 | 2022-01-03 | X11111111 | Y11111111 |
| Key 2 | 2022-12-01 | 2022-12-02 | 2022-12-03 | X22222222 | Y22222222 |
请问最高效的实现方法是什么?我尝试过常规的pivot和聚合操作,但未得到预期结果。
高效解决方案
直接使用groupby结合first()(或max()/min())就能完成需求,适配你的数据特征:
- 同一
Key下,每个日期列仅存在一个非空值,聚合时会提取到该唯一有效日期 - 其他列的数值在同一
Key下完全重复,聚合后会保留该值
代码示例
import pandas as pd # 构造示例数据 data = { 'Key': ['Key 1', 'Key 1', 'Key 1', 'Key 2', 'Key 2', 'Key 2'], 'Date 1': ['2022-01-01', '', '', '2022-12-01', '', ''], 'Date 2': ['', '2022-01-02', '', '', '2022-12-02', ''], 'Date 3': ['', '', '2022-01-03', '', '', '2022-12-03'], 'Column X': ['X11111111']*3 + ['X22222222']*3, 'Column Y': ['Y11111111']*3 + ['Y22222222']*3 } df = pd.DataFrame(data) # 将空字符串转为pandas缺失值,确保聚合函数正确识别 df = df.replace('', pd.NA) # 按Key分组聚合,保留原列结构 result = df.groupby('Key', as_index=False).first() print(result)
关键步骤说明
replace('', pd.NA):把原始数据中的空字符串转为标准缺失值,避免聚合时误将空字符串当作有效值groupby('Key', as_index=False):按Key分组,同时保持Key作为普通列,不转为索引.first():提取每组中各列的第一个非空值,正好匹配日期列的唯一有效值,以及其他列的重复值
这个方法的时间复杂度为O(n),是pandas中处理此类聚合需求的高效方式,比pivot更贴合你的数据场景。
内容的提问来源于stack exchange,提问作者Small potato
相关产品推荐
相关产品推荐

