如何用Python/Pandas合并去重多列时间序列并按日期索引?
问题描述
原始数据集结构如下:
date1 header1 date2 header2 date3 header3 ... 11.12.23 100 11.12.23 90 08.12.23 95 ... 11.12.23 100 08.12.23 89 08.12.23 95 ... 08.12.23 95 08.12.23 89 07.12.23 93 ...
需求:对每个独立时间序列(如[date1, header1]、[date2, header2]等)去除重复值,再按日期合并所有时间序列,得到如下结构的结果:
date header1 header2 header3 ... 11.12.23 100 90 NA ... 08.12.23 95 89 95 ... 07.12.23 NA NA 93 ...
注:已修正header3的值。
Python/Pandas实现步骤
以下是具体实现代码及说明:
1. 导入库并构造/读取数据
先导入pandas,然后读取或构造原始数据集:
import pandas as pd # 示例:构造原始数据(实际场景可替换为pd.read_csv('your_file.csv')) data = { 'date1': ['11.12.23', '11.12.23', '08.12.23'], 'header1': [100, 100, 95], 'date2': ['11.12.23', '08.12.23', '08.12.23'], 'header2': [90, 89, 89], 'date3': ['08.12.23', '08.12.23', '07.12.23'], 'header3': [95, 95, 93] } df = pd.DataFrame(data)
2. 拆分并处理每个时间序列
遍历每一组date-header列对,提取数据后去重:
series_dict = {} # 按每两列一组遍历(date列和对应的header列) for idx in range(0, len(df.columns), 2): date_col = df.columns[idx] header_col = df.columns[idx+1] # 提取当前组数据并去重(默认保留首次出现的记录) temp_df = df[[date_col, header_col]].drop_duplicates() # 将日期设为索引,重命名值列 temp_df = temp_df.set_index(date_col).rename(columns={header_col: header_col}) # 存入字典 series_dict[header_col] = temp_df
3. 合并时间序列并整理结果
将所有处理后的时间序列按日期索引合并,再调整格式:
# 按索引合并,缺失值自动填充为NaN final_df = pd.concat(series_dict.values(), axis=1) # 重置索引,将日期转为普通列 final_df = final_df.reset_index().rename(columns={'index': 'date'}) # 可选:按日期降序排序(需先转换日期格式) final_df['date'] = pd.to_datetime(final_df['date'], format='%d.%m.%y') final_df = final_df.sort_values('date', ascending=False).reset_index(drop=True) # 转回原日期字符串格式 final_df['date'] = final_df['date'].dt.strftime('%d.%m.%y')
4. 查看结果
运行print(final_df)会得到目标格式的数据:
date header1 header2 header3 0 11.12.23 100.0 90.0 NaN 1 08.12.23 95.0 89.0 95.0 2 07.12.23 NaN NaN 93.0
补充说明
- 若需要保留重复值中的最后一条记录,可在
drop_duplicates()中添加参数keep='last' - 日期排序步骤为可选操作,若不需要排序可跳过
- 若原始日期格式不同,调整
pd.to_datetime()中的format参数即可
内容的提问来源于stack exchange,提问作者cornermountain
相关产品推荐
相关产品推荐

