基于X、Y列匹配DataFrame并填充AGE字段的技术实现问询
解决DataFrame基于X、Y匹配并填充AGE列表的问题
首先明确你当前代码的核心问题:
for n in df1遍历的是DataFrame的列名(而非行索引),导致后续取值逻辑完全错误- 嵌套循环逻辑混乱,未实现X、Y两列同时匹配的条件
- Pandas Series没有
push方法,无法通过该方式修改列表元素 - 仅按索引位置比较X/Y值,没有实现基于X/Y内容的精准匹配
以下提供两种可行的实现方案:
方案1:高效的Pandas原生分组合并法(推荐)
该方法利用Pandas的分组和合并功能,避免手动遍历,性能更优,适合大数据量场景:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'X': [20, 10, 15, 20, 0], 'Y': [15, 5, 0, 20, 15], 'AGE': [25, 29, 21, 32, 19] }) df2 = pd.DataFrame({ 'X': [0,0,0,0,0,5,5,5,5,5,10,10,10,10,10,15,15,15,15,15,20,20,20,20,20], 'Y': [0,5,10,15,20,0,5,10,15,20,0,5,10,15,20,0,5,10,15,20,0,5,10,15,20], 'AGE': [[] for _ in range(25)] }) # 1. 将df1按X、Y分组,聚合AGE为列表 grouped_age = df1.groupby(['X', 'Y'])['AGE'].apply(list).reset_index() # 2. 合并到df2,保留df2所有行,匹配X/Y列 df2 = df2.merge(grouped_age, on=['X', 'Y'], how='left', suffixes=('', '_temp')) # 3. 更新AGE列:有匹配值则用聚合后的列表,无匹配则保留原空列表 df2['AGE'] = df2.apply( lambda r: r['AGE_temp'] if pd.notna(r['AGE_temp']) else r['AGE'], axis=1 ) # 4. 删除临时列 df2.drop('AGE_temp', axis=1, inplace=True) # 查看结果 print(df2)
方案2:手动遍历匹配法(适合小数据量)
如果你更习惯手动遍历的逻辑,修正后的代码如下:
import pandas as pd # 构造示例数据(同上) df1 = pd.DataFrame({ 'X': [20, 10, 15, 20, 0], 'Y': [15, 5, 0, 20, 15], 'AGE': [25, 29, 21, 32, 19] }) df2 = pd.DataFrame({ 'X': [0,0,0,0,0,5,5,5,5,5,10,10,10,10,10,15,15,15,15,15,20,20,20,20,20], 'Y': [0,5,10,15,20,0,5,10,15,20,0,5,10,15,20,0,5,10,15,20,0,5,10,15,20], 'AGE': [[] for _ in range(25)] }) # 遍历df1的每一行 for _, df1_row in df1.iterrows(): # 找到df2中X、Y完全匹配的行 match_indices = df2[(df2['X'] == df1_row['X']) & (df2['Y'] == df1_row['Y'])].index # 给每个匹配行的AGE列表添加值 for idx in match_indices: df2.loc[idx, 'AGE'].append(df1_row['AGE']) # 查看结果 print(df2)
两种方案都能得到你预期的输出结果:匹配行的AGE列表会填充对应值,未匹配行保留空列表。
内容的提问来源于stack exchange,提问作者user19678327
相关产品推荐
相关产品推荐

