Python 合并熊猫中的2个数据帧,但不合并第2个数据帧

Python 合并熊猫中的2个数据帧,但不合并第2个数据帧,python,pandas,join,dataframe,merge,Python,Pandas,Join,Dataframe,Merge,数据帧A看起来像 1st name 0 01 AA 1 02 AB 2 03 AC 3 04 AD 4 05 AE pred 1st 2nd name 0 0.25 03 01 NaN 1 0.00 01 03 NaN 2 0.73 02 05 NaN 3 0.93 02

数据帧A看起来像

      1st      name
0     01       AA
1     02       AB
2     03       AC
3     04       AD
4     05       AE
   pred    1st     2nd  name
0  0.25    03       01  NaN
1  0.00    01       03  NaN
2  0.73    02       05  NaN
3  0.93    02       01  NaN
4  0.44    01       02  NaN
B看起来像

   pred    1st     2nd
0  0.25    03       01
1  0.00    01       03
2  0.73    02       05
3  0.93    02       01
4  0.44    01       02
我希望结果是这样的

   pred    1st     2nd   1stName 2ndName
0  0.25    03       01      AC       AA
1  0.00    01       03      AA       AC
2  0.73    02       05      AB       AE
3  0.93    02       01      AB       AA
4  0.44    01       02      AA       AB
我试过了

res = pd.merge(A,B, on='1st', how='outer')
但是我得到了一个零行的数据帧

如何以这种方式合并这些数据帧

编辑: 我得到的结果数据帧如下所示

      1st      name
0     01       AA
1     02       AB
2     03       AC
3     04       AD
4     05       AE
   pred    1st     2nd  name
0  0.25    03       01  NaN
1  0.00    01       03  NaN
2  0.73    02       05  NaN
3  0.93    02       01  NaN
4  0.44    01       02  NaN
合并后,您可以使用将第一列指定给第一列和第二列,最后删除不需要的列

df= pd.merge(df2,df1[['name','1st']], right_on='1st',left_on='1st',how='left')
df= pd.merge(df,df1[['name','1st']], right_on='1st',left_on='2nd',how='left')
df[['1stName','2ndName']] =df[['name_x','name_y']] 
df=df[['pred','1st_x','2nd','1stName', '2ndName']]
print df
输出

   pred  1st_x  2nd 1stName 2ndName
0  0.25      3    1      AC      AA
1  0.00      1    3      AA      AC
2  0.73      2    5      AB      AE
3  0.93      2    1      AB      AA
4  0.44      1    2      AA      AB
合并后,您可以使用将第一列指定给第一列和第二列,最后删除不需要的列

df= pd.merge(df2,df1[['name','1st']], right_on='1st',left_on='1st',how='left')
df= pd.merge(df,df1[['name','1st']], right_on='1st',left_on='2nd',how='left')
df[['1stName','2ndName']] =df[['name_x','name_y']] 
df=df[['pred','1st_x','2nd','1stName', '2ndName']]
print df
输出

   pred  1st_x  2nd 1stName 2ndName
0  0.25      3    1      AC      AA
1  0.00      1    3      AA      AC
2  0.73      2    5      AB      AE
3  0.93      2    1      AB      AA
4  0.44      1    2      AA      AB

您可以使用map来代替合并两个数据帧

df_B['1stname'] = df_B['1st'].map(df_A.set_index('1st')['name'])
df_B['2ndname'] = df_B['2nd'].map(df_A.set_index('1st')['name'])
你得到

    pred    1st 2nd 1stname 2ndname
0   0.25    3   1   AC  AA
1   0.00    1   3   AA  AC
2   0.73    2   5   AB  AE
3   0.93    2   1   AB  AA
4   0.44    1   2   AA  AB

您可以使用map来代替合并两个数据帧

df_B['1stname'] = df_B['1st'].map(df_A.set_index('1st')['name'])
df_B['2ndname'] = df_B['2nd'].map(df_A.set_index('1st')['name'])
你得到

    pred    1st 2nd 1stname 2ndname
0   0.25    3   1   AC  AA
1   0.00    1   3   AA  AC
2   0.73    2   5   AB  AE
3   0.93    2   1   AB  AA
4   0.44    1   2   AA  AB

第二个名字是从哪里来的?我不知道你现在怎么会得到零行。。。它看起来肯定不像您期望的输出。第二个名称来自A。因此,对于B中的第一行,第二个值是03。在数据帧A中,03的名称为AC。这就是为什么在结果中,第二个有2个ACdataframe A的名称比我发布的长。我发布的只是A的前几行,因为我不想发布整个1000多行。对于零行,请参见我的编辑。我得到了行,但名称的值为NaN如果你能构造一个最小的、自包含的示例,那将非常有帮助。我修改了示例,希望它有帮助。第二个名称来自哪里?我不知道你现在怎么会得到零行。。。它看起来肯定不像您期望的输出。第二个名称来自A。因此,对于B中的第一行,第二个值是03。在数据帧A中,03的名称为AC。这就是为什么在结果中,第二个有2个ACdataframe A的名称比我发布的长。我发布的只是A的前几行,因为我不想发布整个1000多行。对于零行,请参见我的编辑。我得到了行,但名称的值为NaN如果你能构造一个最小的、自包含的示例,那将非常有用。我修改了示例,希望它能帮助我也有一个类似的建议:B.mergeA.mergeA,left_on='2',right_on='1',后缀=['''u 2nd','u 1st']@ayhan是的,这是一个简单得多的解决方案:一行不能清理列名。这将需要一个下降和一些重命名,但该行将更长,所以我将保持原样df['1st']=B['1st'].str.astypeint。。。将该列转换为intI也有一个类似的建议:B.mergeA.mergeA,left_on='2nd',right_on='1st',后缀=[''u 2nd',''u 1st']@ayhan是的,这是一个简单得多的解决方案:一行不能清理列名。这将需要一个下降和一些重命名,但该行将更长,所以我将保持原样df['1st']=B['1st'].str.astypeint。。。将该列转换为int您可以将它们转换为int,如下所示:df_B['1st']=df_B['1st'].astypeint您可以将它们转换为int,如下所示:df_B['1st']=df_B['1st'].astypeint