【问题标题】:Merge 2 dataframes in Pandas not merging 2nd dataframe在 Pandas 中合并 2 个数据帧而不合并第二个数据帧
【发布时间】:2017-02-23 18:48:46
【问题描述】:

数据框A 看起来像

      1st      name
0     01       AA
1     02       AB
2     03       AC
3     04       AD
4     05       AE

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')

但我得到一个零行的数据框

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

编辑: 我得到的结果数据框看起来像

   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

【问题讨论】:

  • 第二个名字是从哪里来的?而且我不知道您目前将如何获得零行...它看起来肯定不像您的预期输出。
  • 第二个名字来自A。所以对于B 中的第一行,2nd 的值为 03。在数据帧A 中,03 具有name AC。这就是为什么在结果中,2nd2ndNameAC
  • dataframe A 比我发布的要长。我发布的只是A 的前几行,因为我不想发布整个 1000 多行。至于零行,请参阅我的编辑。我得到了行,但 NaN 的值为 name
  • 如果您可以构建一个最小的、独立的示例,那将非常有帮助。
  • 我修改了例子,希望对你有帮助

标签: python pandas join dataframe merge


【解决方案1】:

您可以使用merge,合并后,将第一个分配给第一个和第二个,最后删除不需要的列。

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

【讨论】:

  • 我也有类似的建议:B.merge(A).merge(A, left_on='2nd', right_on='1st', suffixes=['_2nd', '_1st'])
  • @ayhan 是的,这是更简单的解决方案 :) 一个班轮
  • 我无法清理列名。这将需要删除和一些重命名,但该行会更长,所以我将保持原样。 :)
  • df['1st'] = B['1st'].str.astype(int)... 将该列转换为 int
【解决方案2】:

您可以使用地图而不是合并两个数据框

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

【讨论】:

  • 您可以像这样将它们转换为 int:df_B['1st'] = df_B['1st'].astype(int)
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2019-08-10
  • 2021-04-26
  • 2020-03-27
  • 2018-08-06
相关资源
最近更新 更多