Python Pandas - 数据连接



Pandas 中的数据连接是指沿着指定轴连接两个或多个 Pandas 对象(如 DataFrame 或 Series)的过程。当需要合并来自不同来源或数据集的数据时,此操作非常有用。

此操作的主要工具是 **pd.concat()** 函数,它可用于 **Series**、**DataFrame** 对象,无论您是组合行还是列。Pandas 中的数据连接涉及按行或按列组合多个 DataFrame 或 Series 对象。

在本教程中,我们将探讨如何使用 **pd.concat()** 函数连接 Pandas 对象。我们将讨论不同的场景,包括沿行连接、使用键区分连接的 DataFrame、在连接期间忽略索引以及沿列连接。

理解 pd.concat() 函数

**pandas.concat()** 函数是 Pandas 中用于连接的主要方法。它允许您沿着特定轴连接 pandas 对象,并提供各种用于处理索引的选项。

**pd.concat()** 函数的语法如下:

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

其中:

  • **objs:** 这是 Series、DataFrame 或 Panel 对象的序列或映射。

  • **axis:** {0, 1, ...}, 默认值为 0。这是要沿其连接的轴。

  • **join:** {"inner", "outer"}, 默认值为 "outer"。如何处理其他轴上的索引。 "outer" 表示并集,"inner" 表示交集。

  • **ignore_index:** 布尔值,默认为 False。如果为 True,则不使用连接轴上的索引值。结果轴将标记为 0, ..., n - 1。

  • **keys:** 用于沿连接轴创建分层索引。

  • **levels:** 结果中多层索引要使用的特定层级。

  • **names:** 结果分层索引中层级的名称。

  • **verify_integrity:** 如果为 True,则检查新轴中是否存在重复项,如果发现重复项则引发错误。

  • **sort:** 当组合列未对齐的 DataFrame 时,此参数确保列已排序。

  • **copy:** 默认值为 None。如果为 False,则不必要地复制数据。

**concat()** 函数完成了沿轴执行连接操作的所有繁重工作。让我们创建不同的对象并进行连接。

示例:连接 DataFrame

在此示例中,两个 DataFrame 沿行连接,生成的 DataFrame 具有重复的索引。

import pandas as pd

# Creating two DataFrames
one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])

# Concatenating DataFrames
result = pd.concat([one, two])
print(result)

其**输出**如下:

     Name subject_id  Marks_scored
1    Alex       sub1            98
2     Amy       sub2            90
3   Allen       sub4            87
4   Alice       sub6            69
5  Ayoung       sub5            78
1   Billy       sub2            89
2   Brian       sub4            80
3    Bran       sub3            79
4   Bryce       sub6            97
5   Betty       sub5            88

示例:使用键进行连接

如果要区分连接的 DataFrame,可以使用 keys 参数将特定键与 DataFrame 的每个部分关联。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],keys=['x','y']))

其**输出**如下:

       Name subject_id  Marks_scored
x 1    Alex       sub1            98
  2     Amy       sub2            90
  3   Allen       sub4            87
  4   Alice       sub6            69
  5  Ayoung       sub5            78
y 1   Billy       sub2            89
  2   Brian       sub4            80
  3    Bran       sub3            79
  4   Bryce       sub6            97
  5   Betty       sub5            88

此处,x 和 y 键创建了一个分层索引,可以轻松识别每行来自哪个原始 DataFrame。

示例:在连接期间忽略索引

如果结果对象必须遵循其自身的索引,请将 **ignore_index** 设置为 **True**。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],keys=['x','y'],ignore_index=True))

其**输出**如下:

     Name subject_id  Marks_scored
0    Alex       sub1            98
1     Amy       sub2            90
2   Allen       sub4            87
3   Alice       sub6            69
4  Ayoung       sub5            78
5   Billy       sub2            89
6   Brian       sub4            80
7    Bran       sub3            79
8   Bryce       sub6            97
9   Betty       sub5            88

注意,索引完全改变了,键也被覆盖了。

示例:沿列连接

您可以通过将 **axis** 参数设置为 1 来沿列连接,而不是沿行连接。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],axis=1))

其**输出**如下:

    Name subject_id  Marks_scored   Name subject_id  Marks_scored
1    Alex       sub1            98  Billy       sub2            89
2     Amy       sub2            90  Brian       sub4            80
3   Allen       sub4            87   Bran       sub3            79
4   Alice       sub6            69  Bryce       sub6            97
5  Ayoung       sub5            78  Betty       sub5            88
广告