You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:04