Python pandas如何匹配ID实现两个DataFrame列表值逐元素相除
Pandas按ID匹配后对列表列逐元素相除实现方案
测试数据构造
第一个DataFrame df 构造代码:
import pandas as pd d = {'Name' : pd.Series(['A', 'A', 'A','B', 'B', 'B', 'C', 'D', 'D']), 'ID' : pd.Series(['10', '11', '12','13', '10', '12','14','10','12']), 'Value' : pd.Series([[100,200,300,200,400,600,20,50,100],[100,150,200,100,200,300,200,50,100],[100,200,300,200,400,400,20,40,50],[10,250,200,100,200,400,210,150,100], [100,100,100,200,200,300,200,60,50],[100,200,200,200,100,200,200,410,50],[50,100,240,200,200,450,200,410,50] ,[100,100,200,100,200,100,120,140,150] ,[100,100,200,100,200,100,100,140,150] ]), 'YES' : pd.Series(['Y','N','Y','N','Y','Y','N','N','N'])} df = pd.DataFrame(d)
第二个DataFrame df1 构造代码:
d = {'ID' : pd.Series(['10', '11', '12','13', '14']), 'Value' : pd.Series([[10,20,30,20,40,60,2,5,10],[10,15,20,10,20,30,20,5,10],[10,20,30,20,40,40,2,4,5],[10,25,20,10,20,40,21,15,10],[15,10,20,10,10,10,12,14,15] ]), 'YES' : pd.Series(['Y','N','Y','N','Y'])} df1 = pd.DataFrame(d)
需求说明
- 对
df每一行的Value列表,匹配df1中相同ID对应的Value列表 - 两个列表按索引位置逐元素相除,结果存入新列
Result - 部分预期输出:
Name ID Value YES Result A 10 [100, 200, 300, 200, 400, 600, 20, 50, 100] Y [10,10,10,10,10,10,10,10,10] B 13 [10, 250, 200, 100, 200, 400, 210, 150, 100] N [1,10,10,10,10,10,10,15,10]
实现代码
核心思路是先把df1转成ID到Value列表的映射字典,避免逐行查询DataFrame提升运行效率,再逐行做列表推导计算逐元素除法即可。
# 构建ID与参考Value列表的映射 id_ref_map = df1.set_index('ID')['Value'].to_dict() # 计算逐元素相除结果,需要整数结果直接转int即可 df['Result'] = df.apply( lambda row: [int(a/b) for a, b in zip(row['Value'], id_ref_map[row['ID']])], axis=1 ) # 打印结果验证 print(df[['Name', 'ID', 'Value', 'YES', 'Result']])
运行后输出结果和预期完全匹配,所有ID对应的行都会自动匹配到df1中相同ID的Value列表完成计算。
内容的提问来源于stack exchange,提问作者thangaraj1980
相关产品推荐
相关产品推荐

