获取数据后,需要对数据进行合并,通常是日期,也有对相同公司进行合并
下面就研究数据合并的常用方法:
目录
- append
- merge
- on属性
- how属性(inner,outer,left , right)
- indicator
- concat
- axis
- join
- ~~join_axes~~ 现已删除
- ignore_index
- keys
- levels
- sort
首先创建几个DataFrame,作为样本材料进行练习:
df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list(‘DCBA’), index=list(‘4321’))
df2 = pd.DataFrame(np.ones((4, 4))*2, columns=list(‘FEDC’), index=list(‘6543’))
df3 = pd.DataFrame(np.ones((4, 4))*3, columns=list(‘FEBA’), index=list(‘6521’))
append
df1.append(df2)D C B A F E
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
4 2.0 2.0 NaN NaN 2.0 2.0
3 2.0 2.0 NaN NaN 2.0 2.0
df1.append(df2, ignore_index=True)D C B A F E
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
6 2.0 2.0 NaN NaN 2.0 2.0
7 2.0 2.0 NaN NaN 2.0 2.0
df1.append([df2, df3], ignore_index=True)D C B A F E
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
6 2.0 2.0 NaN NaN 2.0 2.0
7 2.0 2.0 NaN NaN 2.0 2.0
8 NaN NaN 3.0 3.0 3.0 3.0
9 NaN NaN 3.0 3.0 3.0 3.0
10 NaN NaN 3.0 3.0 3.0 3.0
11 NaN NaN 3.0 3.0 3.0 3.0
merge
创建表格
left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'],'B': ['b0', 'b1', 'b2', 'b3'],'k1': ['x', 'x', 'y', 'y']})
right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'],'D': ['d1', 'd2', 'd3', 'd4'],'k1': ['y', 'y', 'z', 'z']})
合并
pd.merge(left,right)A B k1 C D
0 a2 b2 y c1 d1
1 a2 b2 y c2 d2
2 a3 b3 y c1 d1
3 a3 b3 y c2 d2
只保留所有共同列都相等的行
left['k2'] = list('1234')
right['k2'] = list('5678')
d.merge(left,right)
pd.merge(left,right)
A B k1 k2 C D
on属性
指定合并基准列
pd.merge(left,right,on='k1')A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a2 b2 y 3 c2 d2 6
2 a3 b3 y 4 c1 d1 5
3 a3 b3 y 4 c2 d2 6
how属性(inner,outer,left , right)
‘inner’:共同列的值必须完全相等:
pd.merge(left, right, on='k1', how='inner')
A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a2 b2 y 3 c2 d2 6
2 a3 b3 y 4 c1 d1 5
3 a3 b3 y 4 c2 d2 6
‘outer’:共同列的值都会保留,left或right在共同列上的差集,会对它们的缺失列项的值赋上NaN:
pd.merge(left, right, on='k1', how='outer')A B k1 k2_x C D k2_y
0 a0 b0 x 1 NaN NaN NaN
1 a1 b1 x 2 NaN NaN NaN
2 a2 b2 y 3 c1 d1 5
3 a2 b2 y 3 c2 d2 6
4 a3 b3 y 4 c1 d1 5
5 a3 b3 y 4 c2 d2 6
6 NaN NaN z NaN c3 d3 7
7 NaN NaN z NaN c4 d4 8
‘left’:根据左边的DataFrame确定共同列的保留值,右边缺失列项的值赋上NaN:
pd.merge(left, right, on='k1', how='left')A B k1 k2_x C D k2_y
0 a0 b0 x 1 NaN NaN NaN
1 a1 b1 x 2 NaN NaN NaN
2 a2 b2 y 3 c1 d1 5
3 a2 b2 y 3 c2 d2 6
4 a3 b3 y 4 c1 d1 5
5 a3 b3 y 4 c2 d2 6
‘right’:根据右边的DataFrame确定共同列的保留值,左边缺失列项的值赋上NaN:
pd.merge(left, right, on='k1', how='right')A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a3 b3 y 4 c1 d1 5
2 a2 b2 y 3 c2 d2 6
3 a3 b3 y 4 c2 d2 6
4 NaN NaN z NaN c3 d3 7
5 NaN NaN z NaN c4 d4 8
indicator
设置True表示显示合并方式,即left / right / both:
pd.merge(left, right, on='k1', how='outer', indicator=True)
A B k1 k2_x C D k2_y _merge
0 a0 b0 x 1 NaN NaN NaN left_only
1 a1 b1 x 2 NaN NaN NaN left_only
2 a2 b2 y 3 c1 d1 5 both
3 a2 b2 y 3 c2 d2 6 both
4 a3 b3 y 4 c1 d1 5 both
5 a3 b3 y 4 c2 d2 6 both
6 NaN NaN z NaN c3 d3 7 right_only
7 NaN NaN z NaN c4 d4 8 right_only
concat
pd.concat([df1, df2])D C B A F E
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
4 2.0 2.0 NaN NaN 2.0 2.0
3 2.0 2.0 NaN NaN 2.0 2.0
axis
axis=0:竖方向(index)合并,合并方向index作列表相加,非合并方向columns取并集
pd.concat([df1, df2], axis=0)D C B A F E
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
4 2.0 2.0 NaN NaN 2.0 2.0
3 2.0 2.0 NaN NaN 2.0 2.0
axis=1:横方向(columns)合并,合并方向columns作列表相加,非合并方向index取并集
pd.concat([df1, df2], axis=1)D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
join
inner取交集(inner)
pd.concat([df1, df2], axis=0, join='inner')D C
4 1.0 1.0
3 1.0 1.0
2 1.0 1.0
1 1.0 1.0
6 2.0 2.0
5 2.0 2.0
4 2.0 2.0
3 2.0 2.0
outer 取并集(outer)
pd.concat([df1, df2], axis=0, join='outer')D C B A F E
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
4 2.0 2.0 NaN NaN 2.0 2.0
3 2.0 2.0 NaN NaN 2.0 2.0
join_axes 现已删除
合并后,可以设置非合并方向的行/列名称,使用某个df的行/列名称
join_axes=[df1.columns],合并后columns使用df1的
pd.concat([df1, df2], axis=0, join_axes=[df1.columns])D C B A
4 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
6 2.0 2.0 NaN NaN
5 2.0 2.0 NaN NaN
4 2.0 2.0 NaN NaN
3 2.0 2.0 NaN NaN
axes=[df1.index],合并后index使用df2的:
pd.concat([df1, df2], axis=1, join_axes=[df1.index])D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
ignore_index
合并方向是否忽略原行/列名称,而采用系统默认的索引,即从0开始的int。
axis=0时ignore_index=True,index采用系统默认索引:
pd.concat([df1, df2], axis=0, ignore_index=True)D C B A F E
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
6 2.0 2.0 NaN NaN 2.0 2.0
7 2.0 2.0 NaN NaN 2.0 2.
axis=1时ignore_index=True,columns采用系统默认索引:
pd.concat([df1, df2], axis=1, ignore_index=True)0 1 2 3 4 5 6 7
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
keys
可以加一层标签,标识行/列名称属于原来哪个df。
axis=0时设置keys:
pd.concat([df1, df2], axis=0, keys=['df1', 'df2'])D C B A F E
df1 4 1.0 1.0 1.0 1.0 NaN NaN3 1.0 1.0 1.0 1.0 NaN NaN2 1.0 1.0 1.0 1.0 NaN NaN1 1.0 1.0 1.0 1.0 NaN NaN
df2 6 2.0 2.0 NaN NaN 2.0 2.05 2.0 2.0 NaN NaN 2.0 2.04 2.0 2.0 NaN NaN 2.0 2.03 2.0 2.0 NaN NaN 2.0 2.0
axis=1时设置keys:
pd.concat([df1, df2], axis=1, keys=['df1', 'df2'])df1 df2D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
levels
明确行/列名称取值范围:
df = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'], levels=[['df1', 'df2', 'df3', 'df4']])
df.index.levels
FrozenList([['df1', 'df2', 'df3', 'df4'], ['1', '2', '3', '4', '5', '6']])
sort
对列名排序
pd.concat([df1, df2], axis=0, sort=True)A B C D E F
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
对行名排序
pd.concat([df1, df2], axis=1, sort=True)D C B A F E D C
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
DataFrame根据行列名称排序
行名称排序
aa.sort_index(axis=0)A B C D E F
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
3 NaN NaN 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 NaN NaN
4 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN 2.0 2.0 2.0 2.0
列名称排序
aa.sort_index(axis=1)A B C C D D E F
1 1.0 1.0 1.0 NaN 1.0 NaN NaN NaN
2 1.0 1.0 1.0 NaN 1.0 NaN NaN NaN
3 1.0 1.0 1.0 2.0 1.0 2.0 2.0 2.0
4 1.0 1.0 1.0 2.0 1.0 2.0 2.0 2.0
5 NaN NaN NaN 2.0 NaN 2.0 2.0 2.0
6 NaN NaN NaN 2.0 NaN 2.0 2.0 2.0