如何在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_
相关产品推荐
相关产品推荐

