Python pandas如何基于列信息新增行并匹配对应Test Date值
pandas按测试标识拆分多行新增日期字段实现方案
初始数据与规则
初始示例数据集:
import pandas as pd df = pd.DataFrame({ 'ID':[1,2,3], 'E Test':['Y','Y','N'], 'M Test':['Y','Y','Y'], })
字段包含ID、E Test、M Test三类,处理规则:
- 单条ID记录中,若
E Test值为'Y',生成1条对应记录,新增Test Date列赋值为"April 1" - 若
M Test值为'Y',额外生成1条同ID记录,Test Date列赋值为M测试对应日期(示例取"April 15",可按需替换) - 最终同一ID可关联多条不同
Test Date的记录
实现方式
小数据量易读版本(逻辑直观好修改)
直接遍历每行按规则拼接结果,代码可读性高,适合千行级以内小数据集:
result_rows = [] for _, row in df.iterrows(): if row['E Test'] == 'Y': result_rows.append({ 'ID': row['ID'], 'Test Date': 'April 1' }) if row['M Test'] == 'Y': result_rows.append({ 'ID': row['ID'], 'Test Date': 'April 15' }) result_df = pd.DataFrame(result_rows)
大数据量高性能版本(pandas向量化实现)
用pandas原生长宽表转换逻辑实现,无Python层循环,性能更优,适合万行级以上数据集:
# 宽表转长表,拆分两类测试标识 melted_df = df.melt( id_vars='ID', value_vars=['E Test', 'M Test'], var_name='Test Type', value_name='Is_Test' ) # 过滤掉不需要生成记录的N值行 melted_df = melted_df[melted_df['Is_Test'] == 'Y'] # 映射测试类型到对应日期 date_mapping = { 'E Test': 'April 1', 'M Test': 'April 15' } melted_df['Test Date'] = melted_df['Test Type'].map(date_mapping) # 提取目标字段得到最终结果 result_df = melted_df[['ID', 'Test Date']].reset_index(drop=True)
运行结果
两种方式得到的结果一致,输出如下:
ID Test Date 0 1 April 1 1 2 April 1 2 1 April 15 3 2 April 15 4 3 April 15
注:ID=3的E Test取值为N,因此不会生成April 1的记录,仅保留M测试对应的April 15记录,符合规则要求。如果需要保留原始的E Test/M Test字段,在结果拼接时把对应字段加入即可。
内容的提问来源于stack exchange,提问作者Marc Williams
相关产品推荐
相关产品推荐

