详解pandas数据合并与重塑(pd.concat篇)

  • Post category:Python

详解pandas数据合并与重塑(pd.concat篇)

在使用pandas进行数据处理时,经常需要使用到数据合并与重塑操作。其中,pd.concat是一种常用的数据合并方法,本文将详细介绍pd.concat的使用方法,并提供两个示例说明。

pd.concat的基本用法

pd.concat可以将多个数据对象(如Series、DataFrame、Panel等)沿着一条轴(如行、列)进行连接操作。具体用法如下:

pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)

参数说明:

  • objs:要连接的对象,可以是Series、DataFrame、Panel等,必填参数。
  • axis:连接方式,0表示按行连接,1表示按列连接,默认为0。
  • join:连接方式,默认为outer,表示按照两个对象的并集进行连接,还有inner表示按照两个对象的交集进行连接。
  • ignore_index:是否忽略原来的索引,重建一个新索引,默认为False。
  • keys:在连接轴上创建一个分层索引,可以传入一个列表作为多层索引的名称,默认为None。
  • levels:指定keys参数的索引级别名。
  • names:指定levels参数的索引级别名。
  • verify_integrity:检查连接后的数据是否有重复项,默认为False。
  • sort:连接后的数据是否按照字典顺序排序。
  • copy:是否复制数据,默认为True。

下面是一个基本的示例:

import pandas as pd

# 创建两个DataFrame
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({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                   index=[4, 5, 6, 7])

# 按行合并两个DataFrame
result = pd.concat([df1, df2])
print(result)

输出结果:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

以上代码首先创建了两个DataFrame对象df1和df2。然后,使用pd.concat将这两个DataFrame对象按行合并,生成了一个新的DataFrame对象result。

pd.concat的高级用法

在进行数据合并时,有时会出现数据缺失或者重复的情况。pd.concat提供了一些特殊的参数,用于处理这些情况。

下面是一个高级用法的示例:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D', 'E', 'F'],
                    'value1': [1, 2, 3, 4, 5, 6]})
df2 = pd.DataFrame({'key': ['B', 'D', 'F', 'H'],
                    'value2': [10, 20, 30, 40]})

# 按照key列进行合并
result = pd.merge(df1, df2, on='key', how='outer')
print(result)

输出结果:

  key  value1  value2
0   A     1.0     NaN
1   B     2.0    10.0
2   C     3.0     NaN
3   D     4.0    20.0
4   E     5.0     NaN
5   F     6.0    30.0
6   H     NaN    40.0

以上代码创建了两个DataFrame对象df1和df2,分别包含key和value1、key和value2两列数据,其中df2的数据项比df1少。然后,使用pd.merge函数将这两个DataFrame对象按照key列进行合并,使用outer方式指定以外部连接的方式,并生成一个新的DataFrame对象result。

在这个示例中,由于df2数据项比df1少,因此在进行连接时,出现了NaN值。通过使用outer方式指定以外部连接的方式,可以保留所有的数据,避免数据缺失问题。

另外,pd.concat也可以使用keys参数实现类似SQL中的Union All功能。我们可以将两个DataFrame对象连接在一起,使用keys参数指定一个键,这个键会在最终结果的索引中添加一层。

下面是一个Union All的示例:

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']})

# 使用keys参数实现Union All
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)

输出结果:

        A   B   C   D
df1 0  A0  B0  C0  D0
    1  A1  B1  C1  D1
    2  A2  B2  C2  D2
    3  A3  B3  C3  D3
df2 0  A4  B4  C4  D4
    1  A5  B5  C5  D5
    2  A6  B6  C6  D6
    3  A7  B7  C7  D7

在这个示例中,我们使用了keys参数,将df1和df2连接在一起,并为它们指定了两个键“df1”和“df2”。最终结果中,每个数据项都包含了两个键的信息。

总结

pd.concat是pandas库中常用的数据合并方法,可用于连接多个Series、DataFrame、Panel等对象。在使用pd.concat时,需要注意加深对参数的理解,并根据具体场景灵活应用。

本文提供了pd.concat的基本用法和高级用法两个示例,以帮助读者更好地理解和应用pd.concat方法。