根据列

时间:2019-07-24 08:43:38

标签: python pandas dataframe

我有两个数据帧,具体取决于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之外,还有一种优雅的方法吗?

谢谢!

2 个答案:

答案 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