Python 合并熊猫中的2个数据帧,但不合并第2个数据帧
数据帧A看起来像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
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