数据规整化
2017-09-18 本文已影响45人
红炉点雪hi
1.合并数据集
DataFrame 中的merge方法是一种多对一的合并。
df1 = DataFrame({'key':['b','b','a','c','a','a','b'],
'data1':range(7)})
df2 = DataFrame({'key':['a','b','d'],
'data2':range(3)})
print pd.merge(df1,df2)
df1中的数据有多个被标记为a和b的行,而df2中key列的每个值则仅对应一行。对这些对象调用merge即可得到:
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
我们并没有指明要用那个列进行连接,如果没有指定,merge就会将重叠列的列名当做键。但是我们最好显示指定一下
pd.merge(df1,df2,on='key')
如果两个对象的列名不同,也可以分别进行指定:
df3 = DataFrame({'lkey':['b','b','a','c','a','a','b'],
'data1':range(7)})
df4 = DataFrame({'rkey':['a','b','d'],
'data2':range(3)})
print pd.merge(df3,df4,left_on='lkey',right_on='rkey')
'''
data1 lkey data2 rkey
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a
'''
可以看得出来原本两个数据集中的某些数据消失了,这是因为merge做的是'inner'连接;结果中的键是交集。其他方式还有left、right以及outer。外链接求取的是键的并集,组合了左连接和右连接的效果:
pd.merge(df1,df2,how='outer')
'''
输出结果为:
data1 key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
'''
当使用merge方法传入的两个数据集为多对多关系的时候返回的结果将会是笛卡尔积
df1 = DataFrame({'key':['b','b','a','c','a','b'],
'data1':range(6)})
df2 = DataFrame({'key':['a','b','a','b','d'],
'data2':range(5)})
print pd.merge(df1,df2,on='key' ,how='left')
'''
返回结果为:
data1 key data2
0 0 b 1.0
1 0 b 3.0
2 1 b 1.0
3 1 b 3.0
4 2 a 0.0
5 2 a 2.0
6 3 c NaN
7 4 a 0.0
8 4 a 2.0
9 5 b 1.0
10 5 b 3.0
'''
merge也可以传入一个由列名组成的列表:
left = DataFrame({'key1':['foo','foo','bar'],
'key2':['one','two','one'],
'lval':[1,2,3]})
right = DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'rval':[4,5,6,7]})
print pd.merge(left,right,on=['key1','key2'], how='outer')
'''
输出结果为:
key1 key2 lval rval
0 foo one 1.0 4.0
1 foo one 1.0 5.0
2 foo two 2.0 NaN
3 bar one 3.0 6.0
4 bar two NaN 7.0
'''
使用merge去合并两个DataFrame时可能出现一种情况——合并完以后还会出现两列列名一样的列(左右各一列),这个时候suffixes参数可以解决这个问题
left = DataFrame({'key1':['foo','foo','bar'],
'key2':['one','two','one'],
'lval':[1,2,3]})
right = DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'rval':[4,5,6,7]})
print pd.merge(left,right,on='key1',suffixes=('_left','_right'))
'''
输出结果为:
key1 key2_left lval key2_right rval
0 foo one 1 one 4
1 foo one 1 one 5
2 foo two 2 one 4
3 foo two 2 one 5
4 bar one 3 one 6
5 bar one 3 two 7
'''
索引上的合并
有的时候DataFrame中的连接键位于其索引中。这个时候我们可以传入left_index=True或right_index=True已说明索引应该被用作连接键:
left1 = DataFrame({'key':['a','b','a','a','b','c'],
'value':range(6)})
right1 = DataFrame({'group_val':[3.5,7]},index=['a','b'])
print pd.merge(left1,right1,left_on='key',right_index=True)
'''
输出结果为:
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0
'''
但是这种方法用起来往往有些麻烦,所以我们更常用的是join方法