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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:33:26