Pandas 数据合并五大方法详解
在Python 的 Pandas 库中,数据合并是数据处理的重要环节。以下是五种主要的数据合并方法,它们各自适用于不同的场景:
concat, merge, join,append,assign
-
merge():这个函数类似于SQL的JOIN操作,用于基于某些关键字或索引将不同的DataFrame合并成一个新的DataFrame。它可以接受多个要合并的对象以及一个如何匹配这些对象的关键字参数。merge() 默认执行内连接(INNER JOIN),但也可以通过参数设置执行左外连接、右外连接或全外连接。
-
join():此函数主要用于通过索引将不同的DataFrame合并。它通常会自动推断如何连接数据,但也可以通过参数来指定连接类型。与merge()不同的是,join() 主要是在索引上进行操作,而不是基于列。
-
append():这个方法允许您将一个或多个DataFrame添加到原始DataFrame的末尾。它接受一个或多个要添加的DataFrame,并且可以通过设置ignore_index参数来决定是否重置添加后的DataFrame的索引。
-
assign():这个方法允许您在一个现有的DataFrame上添加新的列,新列可以是现有数据的派生或完全是新的数据。这个方法对于创建新列并且基于现有列进行计算非常有用。
concat() 方法
concat() 这个函数主要用于沿着轴向堆叠 DataFrame 或 Series 对象。它可以接受一个列表或字典形式的数据源。
如果传入的是轴标签相同的多个对象,它们会沿着指定轴连接起来。
默认情况下,concat() 沿着行向量堆叠。通过设置 axis 参数,可以改变合并的方向,axis=1 表示列向合并。
基本语法
pandas.concat(objs, axis=0, join='outer', ignore_index=False)
参数:
- objs:要连接的DataFrame对象的序列。
- axis:连接的轴,0表示纵向堆叠,1表示横向堆叠。
- join:连接方式,可以是'outer'或'inner'。
- ignore_index:如果为True,不使用原来的索引,而是使用一个默认的整数索引。
横向堆叠示例
import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'分数': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['黄中', '李白', '周王', '刘备'],'分数': ['34', '65', '77', '87']})# 横向堆叠 示例
new_df = pd.concat([df1, df2], axis=0, join='outer', ignore_index=False)
print(new_df)
运行结果:
姓名 分数
0 张三 78
1 李四 93
2 赵五 87
3 王六 67
0 黄中 34
1 李白 65
2 周王 77
3 刘备 87
设置 ignore_index=True 就可以得到
姓名 分数
0 张三 78
1 李四 93
2 赵五 87
3 王六 67
4 黄中 34
5 李白 65
6 周王 77
7 刘备 87
设置 axis=1 表示列向合并
import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'分数': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['黄中', '李白', '周王', '刘备'],'分数': ['34', '65', '77', '87']})# 纵向堆叠 示例
new_df = pd.concat([df1, df2], axis=1, join='outer', ignore_index=True)
print(new_df)
运行结果
0 1 2 3
0 张三 78 黄中 34
1 李四 93 李白 65
2 赵五 87 周王 77
3 王六 67 刘备 87
merge 方法介绍
pandas 库中的 merge() 方法用于根据一个或多个键将两个 DataFrame 对象进行合并。这个方法类似于 SQL 中的 JOIN 操作,支持多种连接方式,如内连接、外连接、左连接和右连接
默认情况下,它会根据两个DataFrame中的列名进行合并。
pandas.merge(left, right, how='inner', on=None,
left_on=None, right_on=None, left_index=False, right_index=False,
sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
参数说明
left: 主 DataFrame,即左表。
right: 要合并的 DataFrame,即右表。
how: 指定连接方式。支持的选项有 'inner'(内连接)、'outer'(外连接)、'left'(左连接)和 'right'(右连接)。默认为 'inner'。
on: 指定用于连接的列名或索引名。left 和 right 中必须同时存在该列名或索引名。
left_on:指定左表中用于连接的列名或索引名。
right_on:指定右表中用于连接的列名或索引名。
left_index:布尔值,默认为 False。如果为 True,则使用左表的索引作为连接键。
right_index:布尔值,默认为 False。如果为 True,则使用右表的索引作为连接键。
sort:布尔值,默认为 False。如果为 True,则按连接键对结果进行排序。
suffixes:元组,指定当左表和右表中有相同列名时生成的后缀。默认为 ('_x', '_y')。
copy: 布尔值,默认为 True。如果为 False,则避免不必要的复制操作。
indicator:布尔值或字符串,默认为 False。如果为 True,则在结果中添加一列 '_merge',显示每一行来源的表。如果是指定的字符串,则使用该字符串作为列名。
validate: 字符串,指定验证连接的类型。选项包括 'one_to_one'、'one_to_many'、'many_to_one' 和 'many_to_many'。如果指定了此参数,则会在合并前检查连接的类型是否符合要求。
如果我们2个表的数据是这样的
import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'数学': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'语文': ['34', '65', '77', '87']})print(df1)
print(df2)姓名 数学
0 张三 78
1 李四 93
2 赵五 87
3 王六 67姓名 语文
0 张三 34
1 李四 65
2 赵五 77
3 王六 87
我们需要按姓名合并2个表的学生成绩, 期望得到
姓名 数学 语文
0 张三 78 34
1 李四 93 65
2 赵五 87 77
3 王六 67 87
代码示例
import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'数学': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'语文': ['34', '65', '77', '87']})print(df1)
print(df2)
# 使用'姓名'列合并
result = pd.merge(df1, df2, on='姓名')
print(result)
有时候可能df1 表有数据,但是df2表中无数据, 需使用how='left'
import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['李四', '赵五', '王六', '张三'],'数学': ['93', '87', '67', '33']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五'],'语文': ['34', '65', '77']})# 使用'姓名'列合并
result = pd.merge(df1, df2, on='姓名', how='left')
print(result)
运行结果
姓名 数学 语文
0 李四 93 65
1 赵五 87 77
2 王六 67 NaN
3 张三 33 34
读取excel表合并
读取2个excel表的数据后合并
"""
pandas 简单合并2个excel
"""
import pandas as pd# 读取第一个Excel文件
df1 = pd.read_excel('file1.xlsx')
# 读取第二个Excel文件
df2 = pd.read_excel('file2.xlsx')# 连接数据框,axis=0表示按行连接,axis=1表示按列连接
result = pd.concat([df1, df2], axis=0) # 按行连接,你也可以设置为axis=1来按列连接# 查看结果
print(result)