Python 根据列将一个数据帧映射到另一个数据帧

Python 根据列将一个数据帧映射到另一个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧,根据df1的哪一列出现来自df2的值,来自df2的值必须复制到df1的另一个特定列 我尝试在数据帧中循环,但由于数据量太大,需要花费很长时间。我相信一定有某种“潘代克式”的方法可以做到这一点 将熊猫作为pd导入 数据1={'A':['X1','Y1'], 'B':['X2','Y2'], 'A1':['NaN','NaN'], 'B1':['NaN','NaN'], } 数据2={'AB':['X1','Y2','X2','Y1'], ‘D’:[‘D1’、‘D4’、‘D3’、‘D

我有两个数据帧,根据df1的哪一列出现来自df2的值,来自df2的值必须复制到df1的另一个特定列

我尝试在数据帧中循环,但由于数据量太大,需要花费很长时间。我相信一定有某种“潘代克式”的方法可以做到这一点

将熊猫作为pd导入
数据1={'A':['X1','Y1'],
'B':['X2','Y2'],
'A1':['NaN','NaN'],
'B1':['NaN','NaN'],
}
数据2={'AB':['X1','Y2','X2','Y1'],
‘D’:[‘D1’、‘D4’、‘D3’、‘D2’],
}
df1=pd.DataFrame(data1,列=['A','B','A1','B1'])
df2=pd.DataFrame(data2,列=['AB','D'])
如果在df2中发现df1列a的值,则必须将D的相应值复制到列A1。如果在df2中发现df1列B的值,则必须将D的值复制到B1等

a/B中的值可能为NaN,或者df2中没有相应的值

data1_goal = {'A': ['X1', 'Y1'],
        'B': ['X2', 'Y2'],
        'A1': ['D1', 'D2'],
        'B1': ['D3', 'D4'],
        }
df_goal=pd.DataFrame(data1_goal, columns=['A','B','A1','B1'])
除了迭代df1之外,还有一种优雅的方法吗

谢谢大家!

这里有一种方法:

 df1.merge(df2, left_on='A', right_on='AB').merge(
     df1.merge(df2, left_on='B', right_on='AB'), 
     on=['A','B'])[['A', 'B', 'D_x','D_y']].rename(
     columns={'D_x': 'A1','D_y':'B1'})
m=df1.loc[:,['A','B']].melt().merge(df2,left_on='value',right_on='AB').drop('AB',1)
n=m.assign(k=m.groupby('variable').cumcount()).set_index(['variable','k']).unstack(0)
df1=df1.mask(df1.eq('NaN'),n.values) #df1.mask(df1.isna(),n.values) if actual NaN
print(df1)


非常感谢。这似乎奏效了。但在我的实际应用程序中,我有四列,我认为使用这些顺序合并会使代码非常混乱。谢谢。我试图理解你的方法,我想我明白了,但我不太确定cumcount()在做什么。@Maccaroni123尝试打印
m.groupby('variable')。cumcount()
,这会为每个组分配一个计数,例如
a,a
得到
0,1
,再次
B,B
得到
0,1
,我看到了,每个类别都是a,B应该有相同的计数。但是当我设置索引并取消堆栈(.set_index(['variable','k']).unstack(0))时,我的行数几乎是原来的两倍。奇怪的df1.shape[0]=n.shape[0]?@Maccaroni123是否应该在示例中添加更多数据。对于示例数据来说效果很好。可能是另一列或其他什么我发现错误,在melt命令中有一列两次。谢谢你的帮助!
    A   B  A1  B1
0  X1  X2  D1  D3
1  Y1  Y2  D2  D4