如何用Pandas为短DataFrame添加前导零以匹配长数据行数
解决方案:为Pandas时序数据前导补零对齐行数
核心思路
要实现前导补零而非末尾补零,关键是先让两个数据集的索引/行号完全对齐,让缺失值出现在data_1的开头,再填充0。
示例代码(时间戳索引场景)
import pandas as pd from io import StringIO # 模拟用户的时序数据场景 data_0_str = """timestamp,value_0 2023-01-01,10 2023-01-02,20 2023-01-03,30 2023-01-04,40 2023-01-05,50""" data_1_str = """timestamp,value_1 2023-01-03,100 2023-01-04,200 2023-01-05,300""" # 加载数据并将时间设为索引(保证时序对齐) data_0 = pd.read_csv(StringIO(data_0_str), parse_dates=['timestamp'], index_col='timestamp') data_1 = pd.read_csv(StringIO(data_1_str), parse_dates=['timestamp'], index_col='timestamp') # 1. 重新索引data_1,使其与data_0的时间索引完全匹配 data_1_reindexed = data_1.reindex(data_0.index) # 2. 将开头的缺失值填充为0 data_1_filled = data_1_reindexed.fillna(0) # 3. 合并数据集 merged_data = pd.concat([data_0, data_1_filled], axis=1) print(merged_data)
示例代码(整数行号场景)
如果你的时序数据没有时间戳,仅按行号顺序排列:
import pandas as pd from io import StringIO data_0_str = """value_0 10 20 30 40 50""" data_1_str = """value_1 100 200 300""" data_0 = pd.read_csv(StringIO(data_0_str)) data_1 = pd.read_csv(StringIO(data_1_str)) # 重新索引到data_0的行数范围 data_1_reindexed = data_1.reindex(range(len(data_0))) # 填充前导缺失值为0 data_1_filled = data_1_reindexed.fillna(0) merged_data = pd.concat([data_0, data_1_filled], axis=1) print(merged_data)
关键说明
- 之前用
fillna出现末尾补零,是因为直接合并时缺失值出现在data_1的末尾(行数不足补NaN),而reindex会让缺失值出现在data_1的开头(对应data_0早于data_1起始时间的行)。 - 无需预先知晓数据集长度,
len(data_0)或data_0.index会自动获取目标行数/索引范围。
内容的提问来源于stack exchange,提问作者PhysyCola
相关产品推荐
相关产品推荐

