在很多应用中,数据通常散落在不同的文件或数据库中,并不方便进行分析。数据加工就是对这些数据的统一。
- join:连接
- combine:合并
reshape:整形
merge:归并
concatenate:串联
pivot:旋转
- stack:堆叠
import pandas as pd
import numpy as np
合并数据集
pandas里有几种方法可以合并数据:
- pandas.merge 按一个或多个key把DataFrame中的行连接起来。这个和SQL或其他一些关系型数据库中的join操作相似。
- pandas.concat 在一个axis(轴)上,串联或堆叠(stack)多个对象。
- combine_first 实例方法(instance method)能合并相互之间有重复的数据,并用一个对象里的值填满缺失值
这里每一个都会给出一些例子。这些用法贯穿这本书。
1、Concatenating Along an Axis(沿着轴串联)
另一种结合方式被称为可互换的,比如concatenation, binding, or stacking(串联,绑定,堆叠)。Numpy中的concatenate函数可以作用于numpy 数组
arr = np.arange(12.).reshape((3, 4))
arr
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
# Numpy中的concatenate函数
np.concatenate([arr, arr], axis=1)
array([[ 0., 1., 2., 3., 0., 1., 2., 3.],
[ 4., 5., 6., 7., 4., 5., 6., 7.],
[ 8., 9., 10., 11., 8., 9., 10., 11.]])
s1 = pd.Series([0, 1], index=['a', 'b'])
s2 = pd.Series([2, 3, 4], index=['c', 'd', 'e'])
s3 = pd.Series([5, 6], index=['f', 'g'])
df = pd.concat([s1, s2, s3], axis=1, keys=['one','two','three']) # 横向
df
one | two | three | |
---|---|---|---|
a | 0.0 | NaN | NaN |
b | 1.0 | NaN | NaN |
c | NaN | 2.0 | NaN |
d | NaN | 3.0 | NaN |
e | NaN | 4.0 | NaN |
f | NaN | NaN | 5.0 |
g | NaN | NaN | 6.0 |
# 截取部分索引
pd.concat([s1, s2, s3], axis=1, keys=['one','two','three'], join_axes=[['a', 'c', 'b', 'e']])
one | two | three | |
---|---|---|---|
a | 0.0 | NaN | NaN |
c | NaN | 2.0 | NaN |
b | 1.0 | NaN | NaN |
e | NaN | 4.0 | NaN |
# 堆叠
df.stack()
a one 0.0
b one 1.0
c two 2.0
d two 3.0
e two 4.0
f three 5.0
g three 6.0
dtype: float64
2、Database-Style DataFrame Joins(数据库风格的DataFrame Joins)
Merge或join操作,能通过一个或多个key,把不同的数据集的行连接在一起。这种操作主要集中于关系型数据库。pandas中的merge函数是这种操作的主要切入点
df1 = pd.DataFrame({
'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': range(7)})
df1
data1 | key | |
---|---|---|
0 | 0 | b |
1 | 1 | b |
2 | 2 | a |
3 | 3 | c |
4 | 4 | a |
5 | 5 | a |
6 | 6 | b |
df2 = pd.DataFrame({
'key': ['a', 'b', 'd'],
'data2': range(3)})
df2
data2 | key | |
---|---|---|
0 | 0 | a |
1 | 1 | b |
2 | 2 | d |
# 利用merge() 合并数据集
# merge会用两个对象中都存在的列名作为key(键),也可指定参数on
df = pd.merge(df1, df2, on='key')
df
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默认是inner join(内连接),结果中的key是交集的结果,这里不会显示c/d
df3 = pd.DataFrame({
'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': range(7)})
df4 = pd.DataFrame({
'rkey': ['a', 'b', 'd'],
'data2': range(