1. 前言
在数据分析的过程中,我们经常需要将多个DataFrame串联起来,结合起来使用。例如,多个部门的销售数据需要进行整合,在pandas中,最常见的操作就是数据拼接。数据拼接常见的有三种方式,分别是行拼接,列拼接和混合拼接。本文将详细介绍各种拼接方式的使用方法,并提供实现示例。
2. 数据拼接方式介绍
2.1 行拼接(Concatenate)
行拼接,即纵向拼接,也就是将数据按行进行堆叠,使得行数增加。例如,将两个数据表按行拼接:
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']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df_concat = pd.concat([df1, df2], axis=0)
print(df_concat)
其中,pd.concat可以传递一个列表对象,将多个数据表进行合并。axis参数在这里设定为0,表示按照行索引进行合并。执行结果如下:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
0 A4 B4 C4 D4
1 A5 B5 C5 D5
2 A6 B6 C6 D6
3 A7 B7 C7 D7
可以看到,df_concat是df1和df2行方向上堆叠得到的结果。
2.2 列拼接(Merge)
列拼接,即横向拼接,也就是将数据按列进行合并,使列数增加。例如,将两个数据表按列拼接:
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']})
df2 = pd.DataFrame({'E': ['E0', 'E1', 'E2', 'E3'],
'F': ['F0', 'F1', 'F2', 'F3'],
'G': ['G0', 'G1', 'G2', 'G3'],
'H': ['H0', 'H1', 'H2', 'H3']})
df_merge = pd.concat([df1, df2], axis=1)
print(df_merge)
这里同样使用pd.concat将两个DataFrame按照列方向进行合并。如果需要进行列拼接,只需要设定axis参数为1即可。执行结果如下:
A B C D E F G H
0 A0 B0 C0 D0 E0 F0 G0 H0
1 A1 B1 C1 D1 E1 F1 G1 H1
2 A2 B2 C2 D2 E2 F2 G2 H2
3 A3 B3 C3 D3 E3 F3 G3 H3
可以看到,df_merge是df1和df2横向拼接得到的结果。
2.3 混合拼接(Join)
混合拼接,即同时按照行和列进行拼接。例如,在同时增加行和列的情况下,将两个数据表进行合并:
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']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'E': ['E4', 'E5', 'E6', 'E7'],
'F': ['F4', 'F5', 'F6', 'F7'],
'G': ['G4', 'G5', 'G6', 'G7']})
df_join = pd.merge(df1, df2, on='A', how='outer')
print(df_join)
其中,pd.merge是内置的数据拼接方法,其中on参数指定用于连接的列名,how参数指定连接的方式。在这里,on参数指定的是'A'列,how参数指定的是'outer',表示使用外连接,即保留所有的行和列。执行结果如下:
A B C D E F G
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN
4 A4 NaN NaN NaN E4 F4 G4
5 A5 NaN NaN NaN E5 F5 G5
6 A6 NaN NaN NaN E6 F6 G6
7 A7 NaN NaN NaN E7 F7 G7
可以看到,df_join是df1和df2按照'A'列进行外连接的结果,其中保留了所有的行和列。
3. 实现示例
3.1 行拼接实现示例
假设我们有三个数据表,分别是对应时间段内的销售数据,如下:
import pandas as pd
df1 = pd.DataFrame({'日期': ['2021-01-01', '2021-01-02', '2021-01-03'],
'部门': ['A', 'B', 'C'],
'销售额': [100, 200, 300]})
df2 = pd.DataFrame({'日期': ['2021-02-01', '2021-02-02', '2021-02-03'],
'部门': ['A', 'B', 'C'],
'销售额': [150, 250, 350]})
df3 = pd.DataFrame({'日期': ['2021-03-01', '2021-03-02', '2021-03-03'],
'部门': ['A', 'B', 'C'],
'销售额': [200, 300, 400]})
print(df1)
print(df2)
print(df3)
输出结果如下:
日期 部门 销售额
0 2021-01-01 A 100
1 2021-01-02 B 200
2 2021-01-03 C 300
日期 部门 销售额
0 2021-02-01 A 150
1 2021-02-02 B 250
2 2021-02-03 C 350
日期 部门 销售额
0 2021-03-01 A 200
1 2021-03-02 B 300
2 2021-03-03 C 400
现在需要将三个数据表行方向进行拼接,得到所有时间段内的销售数据表。可以通过pd.concat实现,如下:
df_concat = pd.concat([df1, df2, df3], axis=0)
print(df_concat)
输出结果如下:
日期 部门 销售额
0 2021-01-01 A 100
1 2021-01-02 B 200
2 2021-01-03 C 300
0 2021-02-01 A 150
1 2021-02-02 B 250
2 2021-02-03 C 350
0 2021-03-01 A 200
1 2021-03-02 B 300
2 2021-03-03 C 400
可以看到,df_concat是df1、df2和df3行方向上堆叠得到的结果。
3.2 列拼接实现示例
假设我们现在需要统计单个部门在所有时间段内的销售数据,需要将多个数据表列方向进行拼接。可以通过pd.concat实现,如下:
df_merge = pd.concat([df1, df2, df3], axis=1)
df_merge.drop(columns=['部门', '日期'], inplace=True)
df_merge.columns = ['销售额_1', '销售额_2', '销售额_3']
print(df_merge)
其中,drop函数可以删除指定的行或列,inplace参数设为True表示直接修改原数组;columns参数可以对DataFrame进行列名修改。输出结果如下:
销售额_1 销售额_2 销售额_3
0 100 150 200
1 200 250 300
2 300 350 400
可以看到,df_merge是df1、df2和df3列方向上拼接得到的结果。
3.3 混合拼接实现示例
假设我们现在需要统计每个部门在所有时间段内的销售数据,需要将多个数据表进行混合拼接。可以通过pd.merge实现,如下:
df_join = pd.merge(df1, df2, on=['部门', '日期'], how='outer')
df_join = pd.merge(df_join, df3, on=['部门', '日期'], how='outer')
df_join.fillna(0, inplace=True)
df_join = df_join.groupby(['部门']).agg({'销售额': 'sum'}).reset_index()
print(df_join)
其中,fillna函数可以将缺失值替换为0;groupby函数可以按照指定的列进行分组,并对指定的列进行聚合操作;reset_index函数可以重置行索引,使DataFrame重新变成有序数据。输出结果如下:
部门 销售额
0 A 450
1 B 750
2 C 1050
可以看到,df_join是df1、df2和df3按照'部门'和'日期'列进行外连接的结果,并对'销售额'列进行了聚合操作得到的结果。
4. 总结
pandas提供了多种数据拼接方式,可以对不同要求的数据拼接进行实现。其中,行拼接、列拼接和混合拼接是最常用的三种方式。这些拼接方法类似于SQL语言中的集合操作,可以进行快速的表格合并和计算。在实现时需要注意数据表的维度和清晰的列名,以便合并后的数据可以直观的呈现在使用者面前。