pandas数据拼接的实现示例

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语言中的集合操作,可以进行快速的表格合并和计算。在实现时需要注意数据表的维度和清晰的列名,以便合并后的数据可以直观的呈现在使用者面前。

后端开发标签