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

如何在Pandas DataFrame中按规则拆分指定行并生成新行?

问题描述

现有如下Pandas DataFrame:

import pandas as pd

test = pd.DataFrame(
    {'onset': [1,3,18,33,35,50],
     'duration': [2,15,15,2,15,15],
     'type': ['Instr', 'Remember', 'SocTestString', 'Rating', 'SelfTestString', 'XXX']
    }
)

需要生成新的DataFrame,满足以下规则:当type列包含"TestString"时:

  • 将该行拆分为三行,类型命名为原类型+_1、_2、_3(例如SocTestString_1、SocTestString_2、SocTestString_3)
  • 这三行的duration值改为5
  • 这三行的onset值依次为原行onset值、原行onset+5、原行onset+10

最终目标DataFrame如下:

test_final = pd.DataFrame(
    {'onset': [1,3,18,23,28,33,35,40,45,50],
     'duration': [2,15,5,5,5,2,5,5,5,15],
     'type': ['Instr', 'Remember', 'SocTestString_1', 'SocTestString_2', 'SocTestString_3', 'Rating', 'SelfTestString_1', 'SelfTestString_2', 'SelfTestString_3', 'XXX']
    })
解决方案

可以通过遍历原DataFrame逐行处理,构建结果列表后转换为新DataFrame,逻辑清晰易理解:

import pandas as pd

test = pd.DataFrame(
    {'onset': [1,3,18,33,35,50],
     'duration': [2,15,15,2,15,15],
     'type': ['Instr', 'Remember', 'SocTestString', 'Rating', 'SelfTestString', 'XXX']
    }
)

# 初始化空列表存储处理后的行数据
result_rows = []

for _, row in test.iterrows():
    if "TestString" in row['type']:
        base_onset = row['onset']
        base_type = row['type']
        # 生成拆分后的三行
        for i in range(1, 4):
            new_row = row.copy()
            new_row['type'] = f"{base_type}_{i}"
            new_row['duration'] = 5
            new_row['onset'] = base_onset + 5*(i-1)
            result_rows.append(new_row)
    else:
        # 无需拆分的行直接加入结果
        result_rows.append(row)

# 转换为最终DataFrame并重置索引
test_final = pd.DataFrame(result_rows).reset_index(drop=True)

代码说明

  • 遍历原DataFrame的每一行,判断type是否包含目标字符串
  • 对符合条件的行,循环生成3条新数据:通过拼接字符串修改类型名,固定duration为5,按规则计算onset值
  • 不符合条件的行直接保留原数据加入结果列表
  • 最后将结果列表转为DataFrame并重置索引,保证索引连续

运行代码后即可得到目标格式的DataFrame。


内容的提问来源于stack exchange,提问作者jo_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:27:12