pandas dataframe合并

pandas dataframe合并

pandas dataframe合并

1. 前言

在数据分析和处理中,我们经常需要将多个数据集合并成一个数据集来进行更深入的分析。例如,我们可能有多个存储在不同文件或者不同数据库中的数据表,我们希望将这些数据表合并并进行统一的分析。在Python中,pandas库提供了丰富的函数和方法来实现数据合并的操作,其中最常用的就是dataframe的合并。

本文将详细介绍pandas dataframe合并的方法和技巧,并提供一些示例代码来帮助读者理解。

2. 数据合并的基本概念

数据合并可以看作是连接两个或多个表的操作,类似于关系型数据库中的JOIN操作。在pandas中,数据合并主要有以下几种方式:

  • concatenate(拼接):将两个或多个数据表根据某个轴(axis)方向进行拼接,拼接的轴可以是行(纵向拼接)或列(横向拼接)。
  • merge/Join(合并):将两个数据表基于某个列或多个列进行合并,类似于SQL的JOIN操作。
  • append(追加):将一个数据表追加到另一个数据表的末尾。
  • join(连接):根据数据表之间共同的索引进行连接。

接下来,我们将一一介绍这些合并方法的使用。

3. concatenate(拼接)

3.1 拼接多个数据表

在pandas中,可以使用concat()函数来拼接多个数据表。这里我们以两个示例数据表A和B为例来进行说明。

首先,我们创建示例数据表A和B:

import pandas as pd

data_a = {'id': ['1', '2', '3'],
          'name': ['Alice', 'Bob', 'Charlie'],
          'age': [25, 30, 35]}
df_a = pd.DataFrame(data_a)

data_b = {'id': ['4', '5', '6'],
          'name': ['David', 'Eva', 'Frank'],
          'age': [40, 45, 50]}
df_b = pd.DataFrame(data_b)

接下来,我们使用concat()函数进行拼接:

df_concat = pd.concat([df_a, df_b])
print(df_concat)

拼接后的结果如下所示:

  id     name  age
0  1    Alice   25
1  2      Bob   30
2  3  Charlie   35
0  4    David   40
1  5      Eva   45
2  6    Frank   50

在拼接时,默认按照行(纵向)拼接,并保留原始数据表的索引。如果要进行列(横向)拼接,则可以指定参数axis=1。

3.2 拼接时重置索引

在上述示例中,拼接后的结果中保留了原始数据表的索引。如果我们希望在拼接时重置索引,可以使用reset_index()函数。

df_concat_reset_index = pd.concat([df_a, df_b]).reset_index(drop=True)
print(df_concat_reset_index)

重置索引后的结果如下所示:

  id     name  age
0  1    Alice   25
1  2      Bob   30
2  3  Charlie   35
3  4    David   40
4  5      Eva   45
5  6    Frank   50

设置参数drop=True表示丢弃原始索引。

3.3 拼接时添加标签

在拼接多个数据表时,我们可以通过添加标签(label)来区分不同数据表的数据。这样在后续分析中,我们可以根据标签来识别不同的数据来源。

df_concat_with_labels = pd.concat([df_a, df_b], keys=['A', 'B'])
print(df_concat_with_labels)

拼接后的结果如下所示:

    id     name  age
A 0  1    Alice   25
  1  2      Bob   30
  2  3  Charlie   35
B 0  4    David   40
  1  5      Eva   45
  2  6    Frank   50

通过指定参数keys=[‘A’, ‘B’],我们为每个数据表添加了对应的标签。

4. merge/Join(合并)

merge/Join是根据某个列或多个列的值进行合并的操作,类似于SQL的JOIN操作。

我们以两个示例数据表A和B为例来进行演示:

import pandas as pd

data_a = {'id': [1, 2, 3],
          'name': ['Alice', 'Bob', 'Charlie'],
          'age': [25, 30, 35]}
df_a = pd.DataFrame(data_a)

data_b = {'id': [2, 3, 4],
          'gender': ['Male', 'Female', 'Male']}
df_b = pd.DataFrame(data_b)

4.1 内连接(Inner Join)

内连接是取两个数据表中共有的记录,即取两个数据表中满足连接条件的记录。

df_inner_join = pd.merge(df_a, df_b, on='id', how='inner')
print(df_inner_join)

内连接的结果如下所示:

   id     name  age  gender
0   2      Bob   30    Male
1   3  Charlie   35  Female

注:参数how=’inner’表示进行内连接。

4.2 左连接(Left Join)

左连接是取左边数据表中所有的记录,同时取右边数据表中与左边数据表满足连接条件的记录。

df_left_join = pd.merge(df_a, df_b, on='id', how='left')
print(df_left_join)

左连接的结果如下所示:

   id     name  age  gender
0   1    Alice   25     NaN
1   2      Bob   30    Male
2   3  Charlie   35  Female

注:参数how=’left’表示进行左连接。

4.3 右连接(Right Join)

右连接是取右边数据表中所有的记录,同时取左边数据表中与右边数据表满足连接条件的记录。

df_right_join = pd.merge(df_a, df_b, on='id', how='right')
print(df_right_join)

右连接的结果如下所示:

   id     name   age  gender
0   2      Bob  30.0    Male
1   3  Charlie  35.0  Female
2   4      NaN   NaN    Male

注:参数how=’right’表示进行右连接。

4.4 外连接(Outer Join)

外连接是取两个数据表所有的记录,如果某个数据表中缺少对应的连接条件的记录,则填充NaN。

df_outer_join = pd.merge(df_a, df_b, on='id', how='outer')
print(df_outer_join)

外连接的结果如下所示:

   id     name   age  gender
0   1    Alice  25.0     NaN
1   2      Bob  30.0    Male
2   3  Charlie  35.0  Female
3   4      NaN   NaN    Male

注:参数how=’outer’表示进行外连接。

4.5 重复列名处理

在进行合并时,如果两个数据表中有重复的列名,pandas会自动在合并后的结果中添加后缀以区分这些列。

例如,我们将示例数据表A和B中都添加一个名为”age”的列:

data_a = {'id': [1, 2, 3],
          'name': ['Alice', 'Bob', 'Charlie'],
          'age': [25, 30, 35],
          'gender': ['Female', 'Male', 'Female']}
df_a = pd.DataFrame(data_a)

data_b = {'id': [2, 3, 4],
          'gender': ['Male', 'Female', 'Male'],
          'age': [40, 45, 50]}
df_b = pd.DataFrame(data_b)

在合并后的结果中,我们可以看到重复列名”age”被重命名为”age_x”和”age_y”:

df_merge = pd.merge(df_a, df_b, on='id')
print(df_merge)

合并后的结果如下所示:

   id   name  age_x gender_x gender_y  age_y
0   2    Bob      30     Male     Male     40
1   3  Alice      35   Female   Female     45

为了区分重复列名,我们可以在合并时手动指定后缀。

df_merge = pd.merge(df_a, df_b, on='id', suffixes=('_left', '_right'))
print(df_merge)

合并后的结果如下所示:

   id   name  age_left gender_left gender_right  age_right
0   2    Bob        30        Male         Male         40
1   3  Alice        35      Female       Female         45

在参数suffixes中,我们指定了后缀”_left”和”_right”。

5. append(追加)

append()方法可以将一个数据表追加到另一个数据表的末尾。

我们以示例数据表A和B为例来进行演示:

import pandas as pd

data_a = {'id': [1, 2, 3],
          'name': ['Alice', 'Bob', 'Charlie'],
          'age': [25, 30, 35]}
df_a = pd.DataFrame(data_a)

data_b = {'id': [4, 5, 6],
          'name': ['David', 'Eva', 'Frank'],
          'age': [40, 45, 50]}
df_b = pd.DataFrame(data_b)
df_append = df_a.append(df_b)
print(df_append)

追加后的结果如下所示:

   id     name  age
0   1    Alice   25
1   2      Bob   30
2   3  Charlie   35
0   4    David   40
1   5      Eva   45
2   6    Frank   50

6. join(连接)

join()方法是根据数据表之间的共同索引进行连接的操作。

我们以示例数据表A和B为例来进行演示:

import pandas as pd

data_a = {'name': ['Alice', 'Bob', 'Charlie'],
          'age': [25, 30, 35]}
df_a = pd.DataFrame(data_a, index=['a', 'b', 'c'])

data_b = {'gender': ['Male', 'Female', 'Male']}
df_b = pd.DataFrame(data_b, index=['a', 'b', 'd'])
df_join = df_a.join(df_b)
print(df_join)

连接后的结果如下所示:

      name  age  gender
a    Alice   25    Male
b      Bob   30  Female
c  Charlie   35     NaN

在连接时,默认进行左连接,且以df_a的索引为基准。如果指定参数how=’inner’,则进行内连接。

7. 总结

本文详细介绍了pandas中进行数据合并的多种方法,包括concatenate(拼接)、merge/Join(合并)、append(追加)和join(连接)。我们可以根据实际问题的需求选择不同的合并方法来处理数据。在进行合并时,需要注意参数的设置以及处理重复列名的方式,以确保得到准确的合并结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程