数据表的合并
测试数据准备
实验环境为python3.7
和pandas0.23.4
,还有Jupyter Notebook
实验基于以下数据
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7'],
'E': ['E4', 'E5', 'E6', 'E7'],},
index=[2,3,4,5])
- pd.concat
使用方式pd.concat(objs, axis=0, join='outer')
ojbs 是要合并的Series或DataFrame的列表
axis 默认为0,0代表行(竖向),1代表列(横向)
join 连接方式,默认为outer,还可以选择inner
- axis
axis的0,1概念一开始搞不清楚的话,会让人很混乱
简单理解的话,(0,1)就好比于二维数组的(行,列)
所以0代表行,按照一行一行的方式连接两个数据框,一个数据框就代表一行,连接两个数据框,就像是往一个数据框新增一行存放另一个数据框的数据,连接多个数据框就是新增多行,新增的方向是往下的,所以是竖向的。
而1代表列,按照一列一列的方式连接两个数据框,一个数据框代表一列,连接两个数据框,就是往一个数据框新增一列,用来存放另一个数据框的数据,连接多个数据框就是新增多列,新增的方向是往右的,所以是横向的。
result1 = pd.concat([df1,df2],axis=0)
result1
# 输出
A B C D E
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B4 C4 D4 E4
3 NaN B5 C5 D5 E5
4 NaN B6 C6 D6 E6
5 NaN B7 C7 D7 E7
-------------------------------------
result2 = pd.concat([df1,df2],axis=1)
result2
# 输出
A B C D B C D E
0 A0 B0 C0 D0 NaN NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN NaN
2 A2 B2 C2 D2 B4 C4 D4 E4
3 A3 B3 C3 D3 B5 C5 D5 E5
4 NaN NaN NaN NaN B6 C6 D6 E6
5 NaN NaN NaN NaN B7 C7 D7 E7
可以看到,df2整个放在了df1的下面,在df1和df2的基础上,自动补上了原来没有的行列,而且自动填充了空值
- join
join的参数有两个,默认值outer
,还有inner
在我理解,outer就是求两个DataFrame的并集,而inner就是求两个DataFrame的交集
result1 = pd.concat([df1,df2],axis=0, join='outer')
result1
# 输出
A B C D E
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B4 C4 D4 E4
3 NaN B5 C5 D5 E5
4 NaN B6 C6 D6 E6
5 NaN B7 C7 D7 E7
----------------------------------------
result3 = pd.concat([df1,df2], axis=0, join='inner')
result3
# 输出
B C D
0 B0 C0 D0
1 B1 C1 D1
2 B2 C2 D2
3 B3 C3 D3
2 B4 C4 D4
3 B5 C5 D5
4 B6 C6 D6
5 B7 C7 D7
result1 (outer
)保留了df1和df2的列所有的列
result2 (inner
)只保留了df1和df2共同的列