我有两个数据帧,具体取决于df1的哪一列中出现了df2的值,因此必须将df2中的值复制到df1的另一特定列中。
我尝试遍历数据帧,但是由于数据量大,它需要很长时间。我确定一定有某种“泛泛”的方式来做到这一点。
import pandas as pd
data1 = {'A': ['X1', 'Y1'],
'B': ['X2', 'Y2'],
'A1': ['NaN','NaN'],
'B1': ['NaN','NaN'],
}
data2 = {'AB': ['X1', 'Y2', 'X2','Y1'],
'D': ['D1', 'D4', 'D3', 'D2'],
}
df1=pd.DataFrame(data1, columns=['A','B','A1','B1'])
df2=pd.DataFrame(data2, columns=['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之外,还有一种优雅的方法吗?
谢谢!
答案 0 :(得分:1)
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'})
答案 1 :(得分:1)
这里是一种方式:
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)
A B A1 B1
0 X1 X2 D1 D3
1 Y1 Y2 D2 D4