如何用Python匹配两列相似CSV并按ID与item_size填充缺失Cost值?
高效匹配填充CSV数据方案
数据示例
csv1
| ID | item_size | Cost |
|---|---|---|
| 0010 | 4.4 | |
| 0010 | 5.5 | |
| 0012 | 8 | |
| 0012 | 10.1 |
csv2
| ID | item_size | Cost |
|---|---|---|
| 0010 | 6.1 | 5 |
| 0010 | 7.2 | 2 |
| 0010 | 5.3 | 1 |
| 0010 | 3.1 | 3 |
| 0010 | 4.7 | 2 |
| 0012 | 7.6 | 5 |
| 0012 | 22 | 4 |
| 0012 | 13.1 | 2 |
| 0012 | 9.2 | 3 |
| 0012 | 11.1 | 3 |
需求说明
匹配相同ID,找到csv2中与csv1的item_size最接近的值,将对应Cost填充到csv1中,最终输出结构与csv1一致。例如csv1中ID为0010、item_size为4.4的行,匹配csv2同ID下最接近的4.7,填充Cost为2。
当前尝试与问题
已拆分问题为近似值匹配、ID匹配、值填充三部分,实现了近似值匹配脚本:
import numpy as np def closest_value(input_list, input_value): arr = np.asarray(input_list) i = (np.abs(arr - input_value)).argmin() return arr[i] list1 = dataset_1['item_size'].values.tolist() list2 = dataset_2['item_size'].values.tolist() for i in range(len(list2)): val=closest_value(list1,list2[i]) print("The closest value to the "+ str(list[i])+" is",val)
尝试用以下代码处理ID匹配,但该方法会生成大量CSV文件,占用过多计算资源:
import pandas as pd csv1 = pd.read_csv('csv1.csv') csv2= pd.read_csv('csv2.csv') csv2[csv2['ID'].duplicated(keep=False)] csv2.groupby('ID',axis=0).apply(lambda x: x.to_csv(str(x.name) + '.csv'))
现寻求更高效的实现方案。
高效实现方案
可以利用pandas结合numpy,按ID分组后批量处理近似匹配,无需生成中间CSV文件,直接在内存中完成计算:
import pandas as pd import numpy as np # 读取数据,指定ID为字符串类型避免自动转数字 df1 = pd.read_csv('csv1.csv', dtype={'ID': str}) df2 = pd.read_csv('csv2.csv', dtype={'ID': str}) # 定义分组处理函数:为当前ID组的csv1数据匹配对应Cost def fill_cost(group): current_id = group['ID'].iloc[0] # 提取csv2中同ID的所有数据 df2_group = df2[df2['ID'] == current_id] # 转为numpy数组提升匹配效率 sizes = df2_group['item_size'].to_numpy() costs = df2_group['Cost'].to_numpy() # 为每个item_size找到最接近值对应的Cost group['Cost'] = group['item_size'].apply( lambda x: costs[np.abs(sizes - x).argmin()] ) return group # 按ID分组处理并合并结果 result_df = df1.groupby('ID', group_keys=False).apply(fill_cost) # 输出结果,保持原csv1结构 result_df.to_csv('filled_csv1.csv', index=False)
方案优势
- 无中间文件:全程内存处理,避免生成大量临时CSV,节省存储与计算资源
- 高效匹配:利用numpy向量化运算加速近似值查找,比列表循环效率更高
- 结构保留:最终输出与原csv1结构完全一致,无需额外格式调整
内容的提问来源于stack exchange,提问作者Dude Rar
相关产品推荐
相关产品推荐

