基于Pandas实现双CSV关联:按ID匹配添加紧急标识列
问题与解决方案
问题背景
有两个CSV文件结构如下:
表格1(CustomerFloat.csv)
| ID | Urgent number |
|---|---|
| 123 | 2 |
| 234 | 3 |
表格2(EKanbanOrderbook.csv)
| ID | Part | Date |
|---|---|---|
| 123 | A | 01/01/2022 |
| 123 | A | 01/01/2022 |
| 123 | A | 01/01/2022 |
| 123 | A | 01/01/2022 |
| 123 | A | 01/01/2022 |
| 234 | B | 01/01/2022 |
| 234 | B | 01/01/2022 |
| 234 | B | 01/01/2022 |
| 234 | B | 01/01/2022 |
| 234 | B | 01/01/2022 |
| 234 | B | 01/01/2022 |
需求:通过ID匹配两个表格,为表格2新增urgent列,每个ID对应的前N条记录(N为表格1中该ID的Urgent number值)标记为x,其余为空。
用户尝试用循环遍历处理,但代码逻辑错误,无法得到预期结果。
原代码问题分析
字典存储错误:
content_of_rows.update({"uniqueID":uniqueID, "urgentDeficit": urgentDeficit})每次
update都会覆盖字典中相同的键,最终字典仅保留最后一条ID的数据,无法存储所有ID对应的N值。正确的做法应该是用ID作为键,存储对应的Urgent number:content_of_rows[uniqueID] = urgentDeficit。未关联表格2数据:后续循环仅遍历字典,完全没有处理表格2的记录,无法实现标记逻辑。
低效的循环方式: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)
代码说明
- 合并表格:通过
merge将表格1的Urgent number匹配到表格2的每条记录,确保每条记录都能获取对应ID的N值。 - 组内序号:
groupby('ID').cumcount()为每个ID组内的记录从0开始计数,加1后从1开始,方便和N值比较。 - 标记逻辑:用
apply遍历每行,判断组内序号是否小于等于N值,生成urgent列的标记。
执行后将得到预期输出:
| ID | Part | Date | urgent |
|---|---|---|---|
| 123 | A | 01/01/2022 | x |
| 123 | A | 01/01/2022 | x |
| 123 | A | 01/01/2022 | |
| 123 | A | 01/01/2022 | |
| 123 | A | 01/01/2022 | |
| 234 | B | 01/01/2022 | x |
| 234 | B | 01/01/2022 | x |
| 234 | B | 01/01/2022 | x |
| 234 | B | 01/01/2022 | |
| 234 | B | 01/01/2022 | |
| 234 | B | 01/01/2022 |
内容的提问来源于stack exchange,提问作者jhew123
相关产品推荐
相关产品推荐

