【python】pandas:DataFrame合并技巧详解

一、引言

在数据分析过程中,经常需要将多个数据集合并为一个统一的数据集。Pandas库提供了多种合并DataFrame的方法,以满足不同场景下的需求。本文将详细介绍这些合并方法,并通过示例展示其用法。

二、基于键的合并(merge)

基于键的合并是最常用的DataFrame合并方法之一。它类似于SQL中的JOIN操作,可以根据两个DataFrame之间的共同列(键)进行合并。以下是一个示例:

  • 用法:根据两个DataFrame之间的共同列(键)进行合并。
  • 参数说明
    • leftright:要合并的两个DataFrame。
    • how:合并类型,包括’inner’(内连接)、‘left’(左外连接)、‘right’(右外连接)、‘outer’(全外连接)。默认为’inner’。
    • on:用于连接的列名。如果两个DataFrame中有相同名称的列,则默认使用该列作为连接键。
    • left_onright_on:分别指定左表和右表中用于连接的列名。当左右表的连接键列名不同时使用。
    • left_indexright_index:是否使用左表或右表的行索引作为连接键。默认为False。
    • suffixes:用于在合并后的DataFrame中处理重名列的后缀,默认为(‘_x’, ‘_y’)。
  • 优缺点
    • 优点:可以灵活地根据指定列进行合并,支持多种合并类型。
    • 缺点:当数据量较大时,合并操作可能会消耗较多内存和时间。
  • 示例
import pandas as pd

# 创建两个示例DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8]})

# 基于'key'列进行合并
merged_df = pd.merge(df1, df2, on='key', how='inner')  # 默认为inner join
print(merged_df)
# 结果:只保留两个DataFrame中共有的'key'值  
#      key  value1  value2  
# 0    B       2       5  
# 1    D       4       6

在上面的示例中,我们使用了pd.merge()函数,并指定了on参数为合并的键(‘key’)。how参数用于指定合并类型,默认为’inner’,表示只保留两个DataFrame中共有的键。还可以选择’outer’、‘left’、'right’等类型。

三、沿着轴合并(concat)

沿着轴合并适用于将多个DataFrame沿着行或列方向合并。以下是一个示例:

  • 用法:沿着行(axis=0)或列(axis=1)方向合并多个DataFrame。
  • 参数说明
    • objs:要合并的DataFrame列表或字典。
    • axis:合并的轴,0表示行,1表示列。默认为0。
    • ignore_index:是否重置合并后的DataFrame的索引。默认为False。
  • 优缺点
    • 优点:适用于将多个具有相同结构的数据集合并为一个更大的数据集。
    • 缺点:如果沿着列合并,则要求所有DataFrame的行数相同。
  • 示例
# 创建两个示例DataFrame
df3 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df4 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# 沿着行方向(axis=0)合并
concatenated_df = pd.concat([df3, df4], ignore_index=True)
print(concatenated_df)
# 结果:df3和df4的行被合并  
#      A  B  
# 0    1  3  
# 1    2  4  
# 2    5  7  
# 3    6  8

在上面的示例中,我们使用了pd.concat()函数,并指定了axis=0表示沿着行方向合并。ignore_index=True参数用于重置索引。

四、基于索引的合并(join)

基于索引的合并通常用于DataFrame和Series之间的操作。但如果你有两个具有相同索引的DataFrame,并且希望基于索引合并列,你可以使用merge方法或先将其中一个转换为Series。

  • 用法:DataFrame.join(other, on=None, how=‘left’, lsuffix=‘’, rsuffix=‘’, sort=False)

  • 参数说明

    • other:要连接的另一个DataFrame或Series。
    • on:连接的列名。如果为None,则使用索引。
    • how:连接方式,可选值为’left’, ‘right’, ‘outer’, ‘inner’。默认为’left’。
    • lsuffix:左DataFrame中重复列的后缀。
    • rsuffix:右DataFrame中重复列的后缀。
    • sort:是否对结果进行排序。默认为False。
  • 优缺点

    • 优点:适用于基于索引的合并,对于Series与DataFrame之间的操作特别方便。
    • 缺点:对于两个DataFrame之间的基于列名的合并,通常推荐使用merge方法,因为join方法的灵活性相对较低。
  • 示例

假设我们有两个DataFrame:df1和df2,它们有相同的索引。

import pandas as pd

index = ['A', 'B', 'C', 'D']
df1 = pd.DataFrame({'value1': [1, 2, 3, 4]}, index=index)
df2 = pd.DataFrame({'value2': [5, 6, 7, 8]}, index=index)

result = df1.join(df2)
# 结果:df1和df2的列被合并  
# value1  value2  
# A       1       5  
# B       2       6  
# C       3       7  
# D       4       8

五、追加行(append)

append方法用于在Pandas DataFrame中追加行数据。它将另一个DataFrame、Series或类似字典的对象的数据添加到调用者DataFrame的末尾,并返回一个新的DataFrame对象。

  • 用法:DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)

  • 参数说明

    • other:要追加的DataFrame、Series或类似字典的对象。
    • ignore_index:是否忽略索引,默认为False。如果为True,则在结果中重新标记行的索引。
    • verify_integrity:如果为True,在创建具有重复索引的情况下会引发ValueError异常,默认为False。
    • sort:如果为True,则在列不对齐时对列进行排序,默认为False。
  • 优缺点

    • 优点:简单直观,可以快速地将一个DataFrame的行追加到另一个DataFrame的末尾。
    • 缺点:如果两个DataFrame的列名不完全一致,可能会导致数据错位或丢失。此外,如果数据量较大,追加操作可能会消耗较多内存和时间。
  • 示例

import pandas as pd

df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['A', 'B'])

result = df1.append(df2, ignore_index=True)
# 结果:df1和df2的行被合并  
#      A  B  
# 0    1  3  
# 1    2  4  
# 2    5  7  
# 3    6  8

在上面的示例中,我们使用了append()方法将df4的行追加到df3的末尾,并通过ignore_index=True重置了索引。

六、总结

  • 基于键的合并:适用于根据共同列的值匹配和组合行,常见于关联不同数据源的表格数据。
  • 沿着轴合并:适用于将多个DataFrame沿着行或列方向组合成一个更大的DataFrame,常见于时间序列数据、日志数据等的拼接。
  • 基于索引的合并:适用于根据索引匹配和组合行,常见于时间序列数据、分类数据等的匹配和组合。
  • 追加行:适用于将新数据添加到现有DataFrame的末尾,常见于数据收集和分析过程中的结果添加。
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值