如何在pandas DataFrame指定位置批量插入NaN行补全时间步?
实现方案
该需求可以通过pandas高效实现,无需逐行修改原DataFrame,避免索引偏移问题,具体实现如下:
核心思路
- 计算每一行需要展开的总行数:
n = 行['time_step'] // 30,即步长除以30取整,数值等于「需要插入的NaN行数+1行原数据」 - 对原DataFrame的每一行按
n次重复,得到展开后的临时表 - 将每组重复行中除最后一行(原数据行)外的其他行,数值列置为NaN,
time_step统一设为30 - 最后对NaN值做插值填充即可
完整可运行代码
import pandas as pd import numpy as np # 构造示例数据,实际使用时替换为你的数据集即可 df = pd.DataFrame({ 'T1': [15, 19, 18, 16, 16], 'T2': [30, 40, 30, 50, 70], 'time_step': [30, 90, 30, 90, 30] }) # 1. 计算每行需要重复的次数 df['repeat_cnt'] = df['time_step'] // 30 # 2. 按次数重复行,重置索引得到展开后的DataFrame expanded_df = df.loc[df.index.repeat(df['repeat_cnt'])].reset_index(drop=True) # 3. 标记每组重复行的最后一个元素(即原数据行) expanded_df['is_original'] = expanded_df.groupby(level=0).cumcount(ascending=False) == 0 # 4. 非原数据行的数值列置为NaN,time_step统一设为30 expanded_df.loc[~expanded_df['is_original'], ['T1', 'T2']] = np.nan expanded_df['time_step'] = 30 # 5. 删除辅助列,得到插入NaN后的结果 inserted_df = expanded_df.drop(columns=['repeat_cnt', 'is_original']) # 6. 插值填充NaN filled_df = inserted_df.interpolate()
结果验证
插入NaN后未插值的inserted_df输出完全符合预期:
T1 T2 time_step 0 15.0 30.0 30 1 NaN NaN 30 2 NaN NaN 30 3 19.0 40.0 30 4 18.0 30.0 30 5 NaN NaN 30 6 NaN NaN 30 7 16.0 50.0 30 8 16.0 70.0 30
如果需要保留原time_step的90等数值,只需要删除第4步中修改time_step的代码行即可。
原代码问题说明
你之前的写法错误原因是:遍历初始DataFrame的索引时,插入行会导致后续的索引位置持续偏移,for循环的range是基于初始df的行数,永远不会匹配插入后的新索引,而且重复赋值dm_new会导致前面的插入结果被覆盖。
内容的提问来源于stack exchange,提问作者Farnoush
相关产品推荐
相关产品推荐

