当前位置: 首页 > ops >正文

Pandas 数据处理核心操作:合并、替换、统计与分组

        在数据分析中,Pandas 提供了丰富的数据处理功能。本文将详细介绍 Pandas 中几个核心操作:数据合并(merge)、值替换(replace)、统计计算以及分组聚合(groupby),并通过实例代码展示其用法。

目录

数据合并操作

基本合并示例

显示指定 "外键"

左右键名不同时的合并

不同连接方式

处理重复列名

按索引连接

replace 替代值

单个值替换单个值

多个值替换一个值

多个值替换多个值

统计计算和描述

基本统计计算

统计描述

分组与聚合

GroupBy 核心概念

基本分组操作

分组方式拓展


 

数据合并操作

Pandas 提供了 merge 方法用于数据合并,与 concat 不同的是,merge 需要依据某一共同列来进行合并,类似数据库的连接操作。

基本合并示例

import pandas as pd
import numpy as np# 创建示例数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data1': np.random.randint(0, 10, 7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],'data2': np.random.randint(0, 10, 3)})print("df_obj1:")
print(df_obj1)
print("\ndf_obj2:")
print(df_obj2)# 默认合并:将重叠列的列名作为"外键"进行连接
print("\n默认合并结果:")
print(pd.merge(df_obj1, df_obj2))

显示指定 "外键"

# 使用 on 参数显示指定合并的列
print(pd.merge(df_obj1, df_obj2, on='key'))

左右键名不同时的合并

当左右两个 DataFrame 用于合并的列名不同时,可以使用 left_on 和 right_on 参数分别指定:

# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})# 分别指定左右两侧用于合并的列
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2'))

不同连接方式

merge 支持多种连接方式,通过 how 参数指定:

# 外连接(outer):结果中的键是并集
print("外连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='outer'))# 左连接(left):保留左表所有键
print("\n左连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='left'))# 右连接(right):保留右表所有键
print("\n右连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='right'))

处理重复列名

当合并的两个 DataFrame 存在同名但不用于合并的列时,可以使用 suffixes 参数为重复列名添加后缀:

# 创建有重复列名的数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],'data' : np.random.randint(0,10,3)})# 使用 suffixes 处理重复列名
print(pd.merge(df_obj1, df_obj2, on='key', suffixes=('_left', '_right')))

按索引连接

除了按列连接,还可以按索引进行连接:

# 创建按索引连接的示例数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'data2' : np.random.randint(0,10,3)}, index=['a', 'b', 'd'])# 左表按列连接,右表按索引连接
print(pd.merge(df_obj1, df_obj2, left_on='key', right_index=True))

replace 替代值

Pandas 的 replace 方法用于替换 Series 或 DataFrame 中的值,支持多种替换方式:

单个值替换单个值

# 将 Series 中所有值为 1 的元素,替换为 -100
print(ser_obj.replace(1, -100))

示例:若原 ser_obj 是 [1, 2, 3, 1, 5],替换后结果为 [-100, 2, 3, -100, 5]

多个值替换一个值

# 将 Series 中所有值为 6 或 8 的元素,统一替换为 -100
print(ser_obj.replace([6, 8], -100))

示例:若原 ser_obj 是 [5, 6, 7, 8, 9],替换后结果为 [5, -100, 7, -100, 9]

多个值替换多个值

# 按位置一一对应替换:将 4 替换为 -100,将 7 替换为 -200
print(ser_obj.replace([4, 7], [-100, -200]))

示例:若原 ser_obj 是 [3, 4, 5, 7, 8],替换后结果为 [3, -100, 5, -200, 8]

统计计算和描述

Pandas 提供了丰富的统计计算方法,以及 describe() 方法快速生成数据的统计描述。

基本统计计算

import numpy as np
import pandas as pd# 创建 5 行 4 列的 DataFrame
df_obj = pd.DataFrame(np.random.randn(5, 4),  # 生成 5×4 的标准正态分布随机数columns=['a', 'b', 'c', 'd']
)
print("原始 DataFrame:")
print(df_obj)# 按列求和(axis=0 可省略)
col_sum = df_obj.sum()
print("\n按列求和:")
print(col_sum)# 按行求和(axis=1)
row_sum = df_obj.sum(axis=1)
print("\n按行求和:")
print(row_sum)# 按列求最大值
col_max = df_obj.max()
print("\n按列最大值:")
print(col_max)# 按行求最小值
row_min = df_obj.min(axis=1)
print("\n按行最小值:")
print(row_min)# 求均值
print("\n均值:")
print(df_obj.mean())

统计描述

describe() 方法可以快速生成数据的主要统计量:

# 生成统计描述
desc = df_obj.describe()
print("\n统计描述:")
print(desc)# 转置后对行(原列)做统计描述
row_desc = df_obj.T.describe()
print("\n转置后的统计描述:")
print(row_desc)

分组与聚合

在数据分析中,经常需要对数据进行分组并对每组数据进行聚合计算,pandas 的 groupby 功能提供了强大支持。

GroupBy 核心概念

分组是数据分析中按规则拆分数据、应用计算并合并结果的过程,核心流程为:

  • 拆分(split):按指定依据将数据集划分为若干组
  • 应用(apply):对每组数据执行统计或自定义计算
  • 合并(combine):将每组的计算结果整合为最终输出

基本分组操作

import pandas as pd
import numpy as np# 创建示例数据
dict_obj = {'key1': ['a', 'b', 'a', 'b','a', 'b', 'a', 'a'],'key2': ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)
print("原始数据:")
print(df_obj)# 根据 key1 进行分组
grouped1 = df_obj.groupby('key1')
print("\n按 key1 分组后的均值:")
print(grouped1[['data1', 'data2']].mean())# 对特定列根据 key1 进行分组
grouped2 = df_obj['data1'].groupby(df_obj['key1'])
print("\ndata1 列按 key1 分组后的均值:")
print(grouped2.mean())

分组方式拓展

除了按列名分组,Pandas 还支持多种分组方式:

# 1. 自定义 key 列表分组(列表长度需与数据行数一致)
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print("\n自定义 key 分组大小:")
print(df_obj.groupby(self_def_key).size())# 2. 多层列分组(按多个列名组合分组)
print("\n按 key1 和 key2 多层分组大小:")
print(df_obj.groupby(['key1', 'key2']).size())# 3. 按数据类型分组
print("\n按列数据类型分组求和:")
print(df_obj.groupby(df_obj.dtypes, axis=1).sum())# 4. 字典映射分组(适用于列级分组)
mapping_dict = {'data1': 'numeric', 'data2': 'numeric', 'key1': 'category', 'key2': 'category'}
print("\n按字典映射分组求和:")
print(df_obj.groupby(mapping_dict, axis=1).sum())# 5. 函数分组(按函数返回值分组)
print("\n按索引长度分组大小:")
print(df_obj.groupby(lambda idx: len(str(idx))).size())

        以上就是 Pandas 中数据合并、值替换、统计计算和分组聚合的核心操作。这些功能为数据分析提供了强大的支持,能够高效处理各种数据转换和分析任务。根据实际需求选择合适的方法,可以极大提高数据分析的效率。

http://www.xdnf.cn/news/18249.html

相关文章:

  • 分贝单位全指南:从 dB 到 dBm、dBc
  • 深入解析EventPoller:Disruptor的轮询式事件处理机制
  • k8s笔记01
  • 服务器硬盘进行分区和挂载
  • SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • AI +金融 = 七大核心维度+ 落地典型困难
  • 【Golang实战】Go Module 双段 require 配置深度解析
  • Lecture 5 GPUs课程笔记
  • C语言---编译的最小单位---令牌(Token)
  • 认识Node.js及其与 Nginx 前端项目区别
  • KubeBlocks AI:AI时代的云原生数据库运维探索
  • Notepad++批量转UTF-8脚本
  • Flink Stream API - 顶层Operator接口StreamOperator源码超详细讲解
  • 结合SAT-3D,运动+饮食双重养腰新方式
  • Java:将视频上传到腾讯云并通过腾讯云点播播放
  • STM32F407VGT6从零建立一个标准库工程模板+VSCode或Keil5
  • 详解MySQL中的多表查询:多表查询分类讲解、七种JOIN操作的实现
  • 《Linux运维总结:Shell脚本位置参数的具体使用》
  • 【笔记】动手学Ollama 第五章 Ollama 在 LangChain 中的使用 - Python 集成
  • 存储系统中清空日志文件的常用方法总结
  • vue3 el-select 默认选中第一个
  • 链表-24.两两交换链表中的结点-力扣(LeetCode)
  • 绕过 C 标准库限制执行系统命令:系统调用、Shellcode 和裸机二进制
  • 税务专业人员能力构建与发展路径指南
  • Qt5多线程编程详细讲解
  • [递归回溯]679. 24 点游戏
  • 基于RK3568/J6412的EMU多网口控制主机,助力储能工业互联管理和运维
  • PyTorch 社区贡献 和 设计原则
  • 第5课_Rust生命周期和泛型
  • Android MVVM(Model-View-ViewModel)架构