Pandas 数据合并方法 merge()、concat()、combine_first() 方法,数据的重塑和矩阵转置等操作的实现

一、数据合并
pandas 提供了三种主要方法可以用于数据合并:

pandas.merge() 方法 : 数据库风格的合并
pandas.concat() 方法 : 轴向连接,沿着一条轴将多个对象堆叠到一起
combine_first() 方法 :合并重叠数据
1、pandas.merge() 方法
将两个 DataFrame 合并

以列名为连接键
df1 = DataFrame({‘name’:[‘Carl’,‘Lucy’,‘a’,‘b’,‘c’],‘data1’: range(5)})
df2 = DataFrame({‘name’:[‘Carl’,‘Lucy’,‘x’,‘y’,‘z’],‘data2’: range(5)})
'''
df1
name data1
0 Carl 0
1 Lucy 1
2 a 2
3 b 3
4 c 4
df2
name data2
0 Carl 0
1 Lucy 1
2 x 2
3 y 3
4 z 4
'''
#将 df1 df2 合并,以 name 为键(默认参数 how = ‘inner’ 内连接)
pd.merge(df1, df2, on = ‘name’, how = ‘inner’) # 内连接
'''
name data1 data2
0 Carl 0 0
1 Lucy 1 1
'''
pd.merge(df1,df2,on = ‘name’,how = ‘left’) # 左连接
'''
name data1 data2
0 Carl 0 0.0
1 Lucy 1 1.0
2 a 2 NaN
3 b 3 NaN
4 c 4 NaN
'''
pd.merge(df1,df2,on = ‘name’,how = ‘right’) # 右连接
'''
name data1 data2
0 Carl 0.0 0
1 Lucy 1.0 1
2 x NaN 2
3 y NaN 3
4 z NaN 4
'''
以索引作为连接键
left = DataFrame({‘data’:range(5),‘name’:[‘Carl’,‘Lucy’,‘a’,‘b’,‘c’]})
right = DataFrame({‘new_data’:range(5),‘new_name’:[‘Carlnew’,‘Lucynew’,‘x’,‘y’,‘z’]})
'''
left
data name
0 0 Carl
1 1 Lucy
2 2 a
3 3 b
4 4 c
right
new_data new_name
0 0 Carlnew
1 1 Lucynew
2 2 x
3 3 y
4 4 z
'''
left.join(right)
'''
data name new_data new_name
0 0 Carl 0 Carlnew
1 1 Lucy 1 Lucynew
2 2 a 2 x
3 3 b 3 y
4 4 c 4 z
'''

2、pandas.concat() 方法
轴向连接,即沿着一条轴将多个对象堆叠到一起

'''
a:
a 0
b 1
dtype: int64
b:
c 2
d 3
dtype: int64
c:
e 4
f 5
dtype: int64
'''
pd.concat([a,c,b],axis = 0) #默认是按列堆叠
'''
a 0
b 1
e 4
f 5
c 2
d 3
dtype: int64
'''
pd.concat([a,c,b],axis = 1) #按行堆叠
'''
0 1 2
a 0.0 NaN NaN
b 1.0 NaN NaN
e NaN 4.0 NaN
f NaN 5.0 NaN
c NaN NaN 2.0
d NaN NaN 3.0
'''
3、combine_first() 方法
作用 : 合并重叠数据

可以理解为打补丁操作:s1 中有空缺的地方,从 s2 中拿来数据补上

from numpy import nan as Na

s1 = Series([Na,2.0,Na,4.0,Na,6.0],index = list(‘abcdef’))
s2 = Series([100.0,200.0,300.0,Na,Na,600.0],index = list(‘abcdef’))

'''
s1
a NaN
b 2.0
c NaN
d 4.0
e NaN
f 6.0
dtype: float64
s2
a 100.0
b 200.0
c 300.0
d NaN
e NaN
f 600.0
dtype: float64
'''
s1.combine_first(s2)
'''
a 100.0
b 2.0
c 300.0
d 4.0
e NaN
f 6.0
dtype: float64
'''

二、数据重塑 / 轴向旋转
1、数据重塑
定义

重塑指的是将数据重新排列,也叫轴向旋转

DataFrame 提供了两个方法:

stack: 将数据的列 “旋转” 为行
unstack: 将数据的行“旋转”为列
例如:

data = DataFrame(np.arange(9).reshape(3,3),index = pd.Index([‘English’,‘Math’,‘Histioy’],name = ‘Course’),columns= pd.Index([‘Carl’,‘Lucy’,‘Petter’],name = ‘Name’))
'''
Name Carl Lucy Petter
Course
English 0 1 2
Math 3 4 5
Histioy 6 7 8
'''
data.stack()
'''
Course Name
English Carl 0
Lucy 1
Petter 2
Math Carl 3
Lucy 4
Petter 5
Histioy Carl 6
Lucy 7
Petter 8
dtype: int32
'''
data.unstack()
'''
Name Course
Carl English 0
Math 3
Histioy 6
Lucy English 1
Math 4
Histioy 7
Petter English 2
Math 5
Histioy 8
dtype: int32
'''
2、处理堆叠格式
堆叠格式也叫长格式,一般关系型数据库存储时间序列的数据会采用此种格式

虽然这种存储格式对于关系型数据库是好的,不仅保持了关系完整性还提供了方便的查询支持,但是对于数据操作可能就不那么方便了,DataFrame 的数据格式才更加方便。

pivot() 方法

df5 = DataFrame({‘data’:[‘1989-06-01’,‘1989-04-25’,‘1999-07-25’],‘item’:[‘Carl’,‘Lucy’,‘Peter’],‘value’:[‘60’,‘41’,‘44’]})

'''
data item value
0 1989-06-01 Carl 60
1 1989-04-25 Lucy 41
2 1999-07-25 Peter 44
'''

df5.pivot(index=None, columns=None, values=None)

df5.pivot(‘data’,‘item’,‘value’).fillna(‘空值’)
'''
item Carl Lucy Peter
data
1989-04-25 空值 41 空值
1989-06-01 60 空值 空值
1999-07-25 空值 空值 44
'''