如何重构Pandas时间序列格式,将缺失条目填充为NaN值?
Pandas 长表转指定宽表高效实现
核心思路
利用Pandas原生向量化索引操作实现转换,避免自定义循环,适配百万行级数据性能要求。
前置条件
提前整理好需要输出的所有time取值列表(示例中为[0,1,2,3],需包含无任何观测数据的time值)。
实现代码
方案1:无重复(id, time)对时最优
如果确定同一个传感器同一个时间点只有一条测量值,用此方案性能最高:
import pandas as pd import numpy as np # 示例输入构造,实际使用时替换为你的数据源 df = pd.DataFrame({ 'time': [0,2,3,2,3], 'id': [0,0,0,1,1], 'value': [13,15,20,10,12] }) # 定义所有需要输出的time值 all_times = [0,1,2,3] # 转换逻辑 result = df.set_index(['id', 'time'])['value'] \ .unstack(fill_value=np.nan) \ .reindex(columns=all_times) \ .rename(columns=lambda t: f'time{t}') \ .reset_index()
方案2:存在重复(id, time)对时使用
如果同一个传感器在同一个时间点有多个测量值,可通过pivot_table指定聚合规则(取首值、平均值、求和等):
result = pd.pivot_table( df, index='id', columns='time', values='value', aggfunc='first', # 重复数据取第一个值,可替换为np.mean、np.sum等自定义聚合逻辑 fill_value=np.nan ).reindex(columns=all_times) \ .rename(columns=lambda t: f'time{t}') \ .reset_index()
性能优化提示
- 可提前将
id、time列转换为category类型,降低内存占用同时加快索引运算速度 - 若需要保留无任何观测数据的id,可在
reindex时同时传入index=所有id列表参数补全
输出效果
执行上述代码后输出结果与预期完全一致:
| id | time0 | time1 | time2 | time3 |
|---|---|---|---|---|
| 0 | 13 | NaN | 15 | 20 |
| 1 | NaN | NaN | 10 | 12 |
内容的提问来源于stack exchange,提问作者Mark Lavin
相关产品推荐
相关产品推荐

