合并2个数据帧,密钥分为2列

问题描述

我有以下2个数据帧:

>>> df = pandas.DataFrame({'category':['A','A','B','C','C'],'type':['X','Y','X','Z','W'],'data':[21,36,32,26,34,30]})
>>> print(df)
  category type  data
0        A    X    21
1        A    Y    36
2        B    X    32
3        B    Z    26
4        C    Y    34
5        C    W    30

和这个:

>>> df2 = pandas.DataFrame({'category':['A','type1':['X','Y'],'type2':['Y','data2':[121,136,232]})
>>> print(df2)
  category type1 type2  data2
0        A     X     Y    121
1        B     X     Z    136
2        C     Y     W    232

我想合并两个df,使其看起来像这样:

  category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232

我已经尝试过了:

>>> result_test = pd.merge(df,df2,how='left',left_on=['category','type'],right_on = ['category','type1'])
>>> print(result_test)
  category type  data type1 type2  data2
0        A    X    21     X     Y  121.0
1        A    Y    36   NaN   NaN    NaN
2        B    X    32     X     Z  136.0
3        B    Z    26   NaN   NaN    NaN
4        C    Y    34     Y     W  232.0
5        C    W    30   NaN   NaN    NaN

,它在type1上合并。但是,如果我再次尝试使用类型2,它将再添加3列

解决方法

先尝试melt,然后尝试merge

out = df1.merge(df2.melt(['category','data2'],value_name='type').drop('variable',1))
out
Out[40]: 
  category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232
,

它不是仅合并在category上吗?

df.merge(df2[['category','data2']],on='category')

输出:

  category type  data  data2
0        A    X    21    121
1        A    Y    36    121
2        B    X    32    136
3        B    Z    26    136
4        C    Y    34    232
5        C    W    30    232

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...