Pandas和python标准库提供了一组高级的、灵活的、高效的核心函数和算法,它们使你能够轻松地将数据规整化为正确的形式。

1.合并数据集

pandas对象中的数据可以通过一些内置的方式进行合并:

n pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该比较熟悉,应为它实现的就是数据库连接操作。

n pandas.concat可以沿着一条轴将多个对象堆叠到一起。

n 实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。

1.1 数据库风格的DataFrame合并

数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。

In [17]: df1=DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
In [18]: df2=DataFrame({'key':['a','b','d'],'data2':range(3)})
In [19]: df1
Out[19]:
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b
In [20]: df2
Out[20]:
data2 key
0 0 a
1 1 b
2 2 d
1.1.1 合并:pd.merge()
#有公共键情况
In [21]: pd.merge(df1,df2)
Out[21]:
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就回将重叠的列名当做键。(最好显示一下)
1.1.2 指定合并键:on
#有公共键情况
In [22]: pd.merge(df1,df2,on='key')
Out[22]:
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
1.1.3 合并:列名不同
In [23]: df3=DataFrame({'1key':['b','b','a','c','a','a','b'],'data1':range(7)})
In [24]: df4=DataFrame({'2key':['a','b','d'],'data2':range(3)})
In [25]: pd.merge(df3,df4,left_on='1key',right_on='2key')
Out[25]:
1key data1 2key data2
0 b 0 b 1
1 b 1 b 1
2 b 6 b 1
3 a 2 a 0
4 a 4 a 0
5 a 5 a 0
默认情况下,merge做的是“inner”连接;结果中的键是交集。其他方式还有“left”、“right”以及“outer”。外连接求取的是键的并集,组合了左连接和右连接的效果。
1.1.4 外连接:how=’outer’
外连接求取的是键的并集,组合了左连接和右连接的效果。
In [33]: pd.merge(df1,df2,on='key',how='outer')
Out[33]:
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
1.1.5 左连接:how=’left’
LPT标记:指定左键,会以左边为主。左边展示全部,右边只展示与左边公共部分;若左边有,右边没有,则右边为NAN。左边没有,右边有,则不展示。
In [34]: df1=DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
In [35]: df2=DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})
In [36]: pd.merge(df1,df2,on='key',how='left')
Out[36]:
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
多对多连接产生的是行的笛卡尔积。由于左边的DataFrame有3个“b”行,右边的有2个,所以最终结果中就有6个“b”行。连接方式只影响出现在结果中的键:
1.1.6 内连接:how=’inner’
#内连接取的是交集
In [37]: pd.merge(df1,df2,how='inner')
Out[37]:
data1 key data2
0 0 b 1
1 0 b 3
2 1 b 1
3 1 b 3
4 5 b 1
5 5 b 3
6 2 a 0
7 2 a 2
8 4 a 0
9 4 a 2
1.1.7 按多个键合并
要根据多个键进行合并,传入一个由列名组成的列表即可:
In [38]: left=DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'1val':[1,2,3]})
In [39]: right=DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','two','one','two'],'1val':[4,5,6,7]})
In [40]: pd.merge(left,right,on=['key1','key2'],how='outer')
Out[40]:
1val_x key1 key2 1val_y
0 1.0 foo one 4
1 2.0 foo two 5
2 3.0 bar one 6
3 NaN bar two 7