python数据分析(六):Pandas 多数据操作全面指南

Pandas 多数据操作全面指南:Merge, Join, Concatenate 与 Compare

1. 引言

在数据分析工作中,我们经常需要处理多个数据集并将它们以各种方式组合起来。Pandas 提供了多种强大的多数据操作方法,包括合并(merge)、连接(join)、连接(concatenate)和比较(compare)等。本文将详细介绍这些功能,并通过实际代码示例展示如何使用它们。

2. 数据合并 (Merge)

2.1 基本合并操作

merge() 是 Pandas 中最常用的数据合并方法,类似于 SQL 中的 JOIN 操作。

python 复制代码
import pandas as pd

# 创建两个示例DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
                    'value': [1, 2, 3, 4]})

df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],
                    'value': [5, 6, 7, 8]})

# 内连接(inner join)
result = pd.merge(df1, df2, on='key')
print("Inner Join:\n", result)

输出

复制代码
Inner Join:
   key  value_x  value_y
0   B        2        5
1   D        4        6

解释

  • on='key' 指定了合并的键
  • 默认是内连接(inner join),只保留两个DataFrame中都有的键
  • 自动为相同列名添加后缀 _x_y

2.2 不同类型的连接

python 复制代码
# 左连接(left join)
result = pd.merge(df1, df2, on='key', how='left')
print("\nLeft Join:\n", result)

# 右连接(right join)
result = pd.merge(df1, df2, on='key', how='right')
print("\nRight Join:\n", result)

# 外连接(full outer join)
result = pd.merge(df1, df2, on='key', how='outer')
print("\nOuter Join:\n", result)

输出

复制代码
Left Join:
   key  value_x  value_y
0   A        1      NaN
1   B        2      5.0
2   C        3      NaN
3   D        4      6.0

Right Join:
   key  value_x  value_y
0   B      2.0        5
1   D      4.0        6
2   E      NaN        7
3   F      NaN        8

Outer Join:
   key  value_x  value_y
0   A      1.0      NaN
1   B      2.0      5.0
2   C      3.0      NaN
3   D      4.0      6.0
4   E      NaN      7.0
5   F      NaN      8.0

解释

  • how 参数控制连接类型:'left', 'right', 'outer', 'inner'
  • 缺失值用 NaN 填充

2.3 多键合并

python 复制代码
# 创建含有多个键的DataFrame
df3 = pd.DataFrame({'key1': ['A', 'B', 'C', 'D'],
                    'key2': ['W', 'X', 'Y', 'Z'],
                    'value': [1, 2, 3, 4]})

df4 = pd.DataFrame({'key1': ['B', 'D', 'E', 'F'],
                    'key2': ['X', 'Z', 'Y', 'W'],
                    'value': [5, 6, 7, 8]})

# 多键合并
result = pd.merge(df3, df4, on=['key1', 'key2'])
print("\nMulti-key Merge:\n", result)

输出

复制代码
Multi-key Merge:
   key1 key2  value_x  value_y
0    B    X        2        5
1    D    Z        4        6

3. 数据连接 (Join)

3.1 DataFrame的join方法

join()merge() 的便捷方法,默认按索引连接。

python 复制代码
# 设置索引
df1.set_index('key', inplace=True)
df2.set_index('key', inplace=True)

# 使用join连接
result = df1.join(df2, lsuffix='_left', rsuffix='_right')
print("\nJoin on Index:\n", result)

输出

复制代码
Join on Index:
      value_left  value_right
key                          
A           1.0          NaN
B           2.0          5.0
C           3.0          NaN
D           4.0          6.0

解释

  • 默认是左连接
  • 必须指定 lsuffixrsuffix 来处理列名冲突
  • 按索引连接而不是列

3.2 按列连接

python 复制代码
# 重置索引
df1.reset_index(inplace=True)
df2.reset_index(inplace=True)

# 按列连接
result = df1.set_index('key').join(df2.set_index('key'), how='outer', lsuffix='_left', rsuffix='_right')
print("\nJoin on Column:\n", result)

4. 数据连接 (Concatenate)

4.1 基本连接操作

concat() 用于沿特定轴连接多个DataFrame或Series。

python 复制代码
# 创建示例DataFrame
df5 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                    'B': ['B0', 'B1', 'B2']},
                   index=[0, 1, 2])

df6 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
                    'B': ['B3', 'B4', 'B5']},
                   index=[3, 4, 5])

# 垂直连接(沿axis=0)
result = pd.concat([df5, df6])
print("\nVertical Concatenation:\n", result)

# 水平连接(沿axis=1)
result = pd.concat([df5, df6], axis=1)
print("\nHorizontal Concatenation:\n", result)

输出

复制代码
Vertical Concatenation:
     A   B
0  A0  B0
1  A1  B1
2  A2  B2
3  A3  B3
4  A4  B4
5  A5  B5

Horizontal Concatenation:
     A   B    A    B
0  A0  B0  NaN  NaN
1  A1  B1  NaN  NaN
2  A2  B2  NaN  NaN
3  NaN  NaN  A3  B3
4  NaN  NaN  A4  B4
5  NaN  NaN  A5  B5

4.2 连接时处理索引

python 复制代码
# 忽略原有索引
result = pd.concat([df5, df6], ignore_index=True)
print("\nConcatenation with Ignored Index:\n", result)

# 添加多级索引
result = pd.concat([df5, df6], keys=['df5', 'df6'])
print("\nConcatenation with MultiIndex:\n", result)

5. 数据比较 (Compare)

5.1 比较两个DataFrame

Pandas 提供了多种比较DataFrame的方法。

python 复制代码
# 创建两个相似但有差异的DataFrame
df7 = pd.DataFrame({'A': [1, 2, 3],
                    'B': [4, 5, 6]})

df8 = pd.DataFrame({'A': [1, 2, 4],
                    'B': [4, 6, 6]})

# 使用compare方法(需要Pandas 1.1.0+)
try:
    comparison = df7.compare(df8)
    print("\nDataFrame Comparison:\n", comparison)
except AttributeError:
    print("\ncompare() method requires pandas 1.1.0 or later")
    # 替代方法
    diff = df7 != df8
    print("\nDifference:\n", diff)

输出(如果使用compare方法):

复制代码
DataFrame Comparison:
     A       B      
  self other self other
2  3.0   4.0  NaN   NaN
1  NaN   NaN  5.0   6.0

5.2 比较并标记差异

python 复制代码
# 标记所有差异
def highlight_diff(data, color='yellow'):
    attr = f'background-color: {color}'
    other = data.xs('other', axis='columns', level=-1)
    self = data.xs('self', axis='columns', level=-1)
    return pd.DataFrame(np.where(self != other, attr, ''),
                        index=data.index, columns=data.columns)

comparison.style.apply(highlight_diff, axis=None)

6. 其他实用合并技巧

6.1 合并时处理重复列名

python 复制代码
# 合并时有重复列名
df9 = pd.DataFrame({'key': ['A', 'B', 'C'],
                    'value': [1, 2, 3]})

df10 = pd.DataFrame({'key': ['B', 'C', 'D'],
                     'value': [4, 5, 6]})

result = pd.merge(df9, df10, on='key', suffixes=('_left', '_right'))
print("\nMerge with Suffixes:\n", result)

6.2 合并时验证关系

python 复制代码
# 验证合并关系(确保是一对一、一对多或多对一)
try:
    result = pd.merge(df9, df10, on='key', validate='one_to_one')
    print("\nValidated Merge:\n", result)
except Exception as e:
    print("\nValidation Error:", e)

7. 性能考虑

7.1 合并大型DataFrame

python 复制代码
# 创建大型DataFrame
import numpy as np
n = 1000000
big_df1 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),
                        'value1': np.random.randn(n)})

big_df2 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),
                        'value2': np.random.randn(n)})

# 比较合并方法的性能
%timeit pd.merge(big_df1, big_df2, on='key')
%timeit big_df1.merge(big_df2, on='key')

8. 总结

  1. merge() 是最灵活的数据合并方法,支持各种SQL风格的连接操作

    • 支持内连接、左连接、右连接和外连接
    • 可以处理多键合并和复杂的合并条件
  2. join() 是基于索引的合并便捷方法

    • 默认按索引连接
    • 语法比merge()更简洁但功能较少
  3. concat() 用于简单堆叠数据

    • 可以沿行(垂直)或列(水平)方向连接
    • 适合结构相同的数据集合并
  4. compare() 用于比较两个DataFrame的差异

    • 可以高亮显示差异
    • 需要Pandas 1.1.0及以上版本
  5. 性能考虑

    • 对于大型数据集,merge()通常比join()更快
    • 合并前适当设置索引可以提高性能

选择合适的多数据操作方法取决于:

  • 数据的大小和结构
  • 需要执行的连接类型
  • 是否需要保留所有数据或只保留匹配项

掌握这些多数据操作技术将大大提高你在实际数据分析工作中的效率和灵活性。

相关推荐
小羊Linux客栈3 小时前
Python小程序:上班该做点摸鱼的事情
开发语言·python·小程序·游戏程序
老胖闲聊4 小时前
Python PyTorch库【机器学习框架】全面深入讲解与实践
pytorch·python·机器学习
27669582925 小时前
得物 小程序 6宫格 分析
java·python·小程序·得物·得物小程序·得物六宫格·六宫格验证码
天才测试猿6 小时前
基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解
自动化测试·软件测试·python·测试工具·单元测试·测试用例·pytest
啊阿狸不会拉杆6 小时前
人工智能数学基础(三):微积分初步
人工智能·python·算法·数学建模
weixin_307779137 小时前
在Azure Databricks中实现缓慢变化维度(SCD)的三种类型
数据仓库·python·spark·云计算·azure
啊阿狸不会拉杆8 小时前
人工智能数学基础(四):线性代数
人工智能·python·数学·算法·机器学习
豆芽8199 小时前
感受野(Receptive Field)
人工智能·python·深度学习·yolo·计算机视觉
赛卡9 小时前
IPOF方法学应用案例:动态电压频率调整(DVFS)在AIoT芯片中的应用
开发语言·人工智能·python·硬件工程·软件工程·系统工程·ipof