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

基于Pandas实现双CSV关联:按ID匹配添加紧急标识列

问题与解决方案

问题背景

有两个CSV文件结构如下:

表格1(CustomerFloat.csv)

IDUrgent number
1232
2343

表格2(EKanbanOrderbook.csv)

IDPartDate
123A01/01/2022
123A01/01/2022
123A01/01/2022
123A01/01/2022
123A01/01/2022
234B01/01/2022
234B01/01/2022
234B01/01/2022
234B01/01/2022
234B01/01/2022
234B01/01/2022

需求:通过ID匹配两个表格,为表格2新增urgent列,每个ID对应的前N条记录(N为表格1中该ID的Urgent number值)标记为x,其余为空。

用户尝试用循环遍历处理,但代码逻辑错误,无法得到预期结果。

原代码问题分析

  1. 字典存储错误:

    content_of_rows.update({"uniqueID":uniqueID, "urgentDeficit": urgentDeficit})
    

    每次update都会覆盖字典中相同的键,最终字典仅保留最后一条ID的数据,无法存储所有ID对应的N值。正确的做法应该是用ID作为键,存储对应的Urgent number:content_of_rows[uniqueID] = urgentDeficit。

  2. 未关联表格2数据:后续循环仅遍历字典,完全没有处理表格2的记录,无法实现标记逻辑。

  3. 低效的循环方式:Pandas适合向量化操作,手动遍历行效率低且易出错。

正确实现代码

import pandas as pd

# 读取CSV文件
table1 = pd.read_csv(r'CustomerFloat.csv')
table2 = pd.read_csv(r'EKanbanOrderbook.csv')

# 将表格1的ID与Urgent number映射合并到表格2
table2 = table2.merge(table1, on='ID', how='left')

# 按ID分组,为每组内的记录添加组内序号(从1开始计数)
table2['group_rank'] = table2.groupby('ID').cumcount() + 1

# 生成urgent列:组内序号<=Urgent number时标记'x',否则为空
table2['urgent'] = table2.apply(lambda row: 'x' if row['group_rank'] <= row['Urgent number'] else '', axis=1)

# 清理临时列
table2 = table2.drop(['Urgent number', 'group_rank'], axis=1)

# 输出结果
print(table2)

代码说明

  1. 合并表格:通过merge将表格1的Urgent number匹配到表格2的每条记录,确保每条记录都能获取对应ID的N值。
  2. 组内序号:groupby('ID').cumcount()为每个ID组内的记录从0开始计数,加1后从1开始,方便和N值比较。
  3. 标记逻辑:用apply遍历每行,判断组内序号是否小于等于N值,生成urgent列的标记。

执行后将得到预期输出:

IDPartDateurgent
123A01/01/2022x
123A01/01/2022x
123A01/01/2022
123A01/01/2022
123A01/01/2022
234B01/01/2022x
234B01/01/2022x
234B01/01/2022x
234B01/01/2022
234B01/01/2022
234B01/01/2022

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:24:27