如何基于X、Y两列匹配Python DataFrame并存储对应AGE值?
基于X、Y列匹配DataFrame并更新AGE列表的正确实现
原代码存在的问题
- 遍历
df1时默认迭代的是列名(而非行索引),导致df1["X"].values[n]会因索引类型不匹配报错 - 嵌套循环逻辑混乱,未实现“X、Y组合匹配”的核心需求
- pandas的Series没有
push方法,无法直接用该操作添加元素
推荐实现方法
方法1:用pandas内置方法高效处理(适合大数据量)
利用groupby聚合AGE列表,再通过merge匹配到df2中,是性能最优的方案:
import pandas as pd # 构建示例数据 df1 = pd.DataFrame({ 'X': [2.0, 1.0, 1.5, 2.0, 0.0], 'Y': [1.5, 0.5, 0.5, 2.0, 1.5], 'AGE': [25, 29, 21, 32, 19] }) df2 = pd.DataFrame({ 'X': [0.0]*5 + [0.5]*5 + [1.0]*5 + [1.5]*5 + [2.0]*5, 'Y': [0.0,0.5,1.0,1.5,2.0]*5, 'AGE': [[] for _ in range(25)] }) # 按X、Y分组,聚合AGE为列表 age_groups = df1.groupby(['X', 'Y'])['AGE'].apply(list).reset_index() # 合并到df2,填充未匹配的行保持原空列表 df2 = df2.merge(age_groups, on=['X', 'Y'], how='left', suffixes=('', '_new')) df2['AGE'] = df2['AGE_new'].fillna(df2['AGE']).apply(lambda x: x if isinstance(x, list) else []) df2.drop(columns=['AGE_new'], inplace=True) # 查看结果 print(df2)
方法2:构建映射字典遍历更新(逻辑直观)
先把df1的X-Y组合和AGE值存入字典,再遍历df2匹配更新:
import pandas as pd # 构建示例数据(同上) df1 = pd.DataFrame({ 'X': [2.0, 1.0, 1.5, 2.0, 0.0], 'Y': [1.5, 0.5, 0.5, 2.0, 1.5], 'AGE': [25, 29, 21, 32, 19] }) df2 = pd.DataFrame({ 'X': [0.0]*5 + [0.5]*5 + [1.0]*5 + [1.5]*5 + [2.0]*5, 'Y': [0.0,0.5,1.0,1.5,2.0]*5, 'AGE': [[] for _ in range(25)] }) # 构建(X,Y)到AGE的映射字典 age_map = df1.set_index(['X', 'Y'])['AGE'].to_dict() # 遍历df2更新AGE列 for idx, row in df2.iterrows(): key = (row['X'], row['Y']) if key in age_map: df2.at[idx, 'AGE'] = [age_map[key]] # 查看结果 print(df2)
内容的提问来源于stack exchange,提问作者user19678327
相关产品推荐
相关产品推荐

