【发布时间】:2016-07-23 19:12:29
【问题描述】:
这是this question的后续报道
我有两个pandas DataFrame,如下:
print( a )
foo bar let letval
9 foo1 bar1 let1 a
8 foo2 bar2 let1 b
7 foo3 bar3 let1 c
6 foo1 bar1 let2 z
5 foo2 bar2 let2 y
4 foo3 bar3 let2 x
print( b )
foo bar num numval
0 foo1 bar1 num1 1
1 foo2 bar2 num1 2
2 foo3 bar3 num1 3
3 foo1 bar1 num2 4
4 foo2 bar2 num2 5
5 foo3 bar3 num2 6
我想merge 他们两个在[ 'foo', 'bar' ] 列上。
如果我只是做c = pd.merge( a, b, on=['foo', 'bar'] ),我会得到:
prnint( c )
foo bar let letval num numval
0 foo1 bar1 let1 a num1 1
1 foo1 bar1 let1 a num2 4
2 foo1 bar1 let2 z num1 1
3 foo1 bar1 let2 z num2 4
4 foo2 bar2 let1 b num1 2
5 foo2 bar2 let1 b num2 5
6 foo2 bar2 let2 y num1 2
7 foo2 bar2 let2 y num2 5
8 foo3 bar3 let1 c num1 3
9 foo3 bar3 let1 c num2 6
10 foo3 bar3 let2 x num1 3
11 foo3 bar3 let2 x num2 6
我想要:
print( c )
foo bar let letval num numval
0 foo1 bar1 let1 a num1 1
1 foo2 bar2 let1 b num1 2
2 foo3 bar3 let1 c num1 3
3 foo1 bar1 let2 z num2 4
4 foo2 bar2 let2 y num2 5
5 foo3 bar3 let2 x num2 6
我得到的最接近的是:
c = pd.merge( a, b, left_index=['foo', 'bar'], right_index=['foo', 'bar'] )
我错过了什么?
为什么我在第一个例子中得到c.shape = (12,6)?
编辑
感谢@piRSquared's answer,我意识到根本问题是没有单一的列组合可以做到这一点。因此,如前所述的合并问题不能一概而论地解决。也就是说,这个问题被转换成一个更简单的问题:
如何在表之间建立明确的关系?
我使用映射需要对齐的所需输出的字典解决了这个问题:
map_ab = { 'num1':'let1', 'num2':'let2' }
b['let'] = b.apply( lambda x: map_ab[x['num']], axis=1 )
c = pd.merge( a, b, on=['foo', 'bar', 'let'] )
print( c )
【问题讨论】: