【AI Study】第四天,Pandas(9)- 进阶主题

文章概要

本文详细介绍 Pandas 的进阶主题,包括:

  • 自定义函数
  • 高级索引
  • 数据导出
  • 实际应用示例

自定义函数

函数应用

# 基本函数应用
def calculate_bonus(salary, performance):"""计算奖金Args:salary (float): 基本工资performance (float): 绩效分数 (0-1)Returns:float: 奖金金额"""return salary * performance * 0.1# 应用到 DataFrame
df['bonus'] = df.apply(lambda x: calculate_bonus(x['salary'], x['performance']),axis=1
)# 使用 applymap 应用到所有元素
def format_currency(x):"""格式化货币Args:x (float): 金额Returns:str: 格式化后的金额"""return f"${x:,.2f}"df = df.applymap(format_currency)# 使用 transform 保持索引
def normalize_column(x):"""标准化列Args:x (pd.Series): 输入序列Returns:pd.Series: 标准化后的序列"""return (x - x.mean()) / x.std()df['normalized_value'] = df.groupby('category')['value'].transform(normalize_column)

函数映射

# 使用 map 进行值映射
category_map = {'A': 'High','B': 'Medium','C': 'Low'
}df['category_level'] = df['category'].map(category_map)# 使用 replace 进行值替换
df['status'] = df['status'].replace({'active': 1,'inactive': 0,'pending': -1
})# 使用 apply 进行复杂映射
def map_complex_value(row):"""复杂值映射Args:row (pd.Series): 行数据Returns:str: 映射后的值"""if row['age'] < 18:return 'Minor'elif row['age'] < 65:return 'Adult'else:return 'Senior'df['age_group'] = df.apply(map_complex_value, axis=1)

函数优化

# 使用 numba 优化函数
from numba import jit@jit(nopython=True)
def calculate_statistics(values):"""计算统计量Args:values (np.array): 数值数组Returns:tuple: (均值, 标准差)"""mean = 0.0for x in values:mean += xmean /= len(values)std = 0.0for x in values:std += (x - mean) ** 2std = (std / len(values)) ** 0.5return mean, std# 使用向量化操作
def vectorized_calculation(df):"""向量化计算Args:df (pd.DataFrame): 输入数据Returns:pd.DataFrame: 计算结果"""# 使用 numpy 的向量化操作df['result'] = np.where(df['value'] > df['threshold'],df['value'] * 1.1,df['value'] * 0.9)return df# 使用并行处理
from multiprocessing import Pooldef parallel_process(df, func, n_cores=4):"""并行处理Args:df (pd.DataFrame): 输入数据func (function): 处理函数n_cores (int): 核心数Returns:pd.DataFrame: 处理结果"""# 分割数据chunks = np.array_split(df, n_cores)# 创建进程池pool = Pool(n_cores)# 并行处理results = pool.map(func, chunks)# 合并结果return pd.concat(results)

高级索引

多级索引

# 创建多级索引
df = pd.DataFrame({'value': np.random.randn(100),'category': np.random.choice(['A', 'B', 'C'], 100),'subcategory': np.random.choice(['X', 'Y', 'Z'], 100)
})# 设置多级索引
df = df.set_index(['category', 'subcategory'])# 使用多级索引
# 选择特定类别
df.loc['A']# 选择特定子类别
df.loc[('A', 'X')]# 使用 xs 进行交叉选择
df.xs('X', level='subcategory')# 重置索引
df = df.reset_index()# 使用 stack 和 unstack
df_stacked = df.stack()
df_unstacked = df.unstack()

索引操作

# 设置索引
df = df.set_index('date')# 重置索引
df = df.reset_index()# 重命名索引
df.index.name = 'date'
df.index = df.index.rename('date')# 索引排序
df = df.sort_index()# 索引对齐
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['b', 'c', 'd'])
df_aligned = df1.align(df2, join='outer')# 索引转换
df.index = pd.to_datetime(df.index)

索引优化

# 检查索引是否唯一
is_unique = df.index.is_unique# 检查索引是否单调
is_monotonic = df.index.is_monotonic# 检查索引是否已排序
is_sorted = df.index.is_monotonic_increasing# 优化索引
def optimize_index(df):"""优化索引Args:df (pd.DataFrame): 输入数据Returns:pd.DataFrame: 优化后的数据"""# 检查索引类型if isinstance(df.index, pd.DatetimeIndex):# 确保索引已排序if not df.index.is_monotonic:df = df.sort_index()# 检查索引是否连续if not df.index.is_monotonic_increasing:df = df.reindex(pd.date_range(df.index.min(),df.index.max(),freq='D'))return df# 使用示例
df = pd.DataFrame({'value': np.random.randn(100)
}, index=pd.date_range('2023-01-01', periods=100))# 优化索引
df = optimize_index(df)

数据导出

格式转换

# 导出为 CSV
df.to_csv('output.csv', index=False)# 导出为 Excel
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)# 导出为 JSON
df.to_json('output.json', orient='records')# 导出为 SQL
from sqlalchemy import create_engine
engine = create_engine('sqlite:///database.db')
df.to_sql('table_name', engine, if_exists='replace')# 导出为 HTML
df.to_html('output.html')# 导出为 Markdown
df.to_markdown('output.md')

数据压缩

# 使用 gzip 压缩
df.to_csv('output.csv.gz', compression='gzip', index=False)# 使用 zip 压缩
df.to_csv('output.csv.zip', compression='zip', index=False)# 使用 bz2 压缩
df.to_csv('output.csv.bz2', compression='bz2', index=False)# 使用 xz 压缩
df.to_csv('output.csv.xz', compression='xz', index=False)# 自定义压缩函数
def compress_data(df, output_file, compression='gzip'):"""压缩数据Args:df (pd.DataFrame): 输入数据output_file (str): 输出文件路径compression (str): 压缩方式"""df.to_csv(output_file, compression=compression, index=False)

批量处理

# 批量导出
def batch_export(df, output_dir, chunk_size=10000):"""批量导出数据Args:df (pd.DataFrame): 输入数据output_dir (str): 输出目录chunk_size (int): 块大小"""# 创建输出目录import osos.makedirs(output_dir, exist_ok=True)# 分块导出for i, chunk in enumerate(np.array_split(df, len(df) // chunk_size + 1)):output_file = os.path.join(output_dir, f'chunk_{i}.csv')chunk.to_csv(output_file, index=False)# 批量转换格式
def batch_convert(input_dir, output_dir, input_format='csv', output_format='excel'):"""批量转换格式Args:input_dir (str): 输入目录output_dir (str): 输出目录input_format (str): 输入格式output_format (str): 输出格式"""# 创建输出目录import osos.makedirs(output_dir, exist_ok=True)# 获取输入文件列表input_files = [f for f in os.listdir(input_dir) if f.endswith(f'.{input_format}')]# 转换每个文件for input_file in input_files:# 读取输入文件input_path = os.path.join(input_dir, input_file)df = pd.read_csv(input_path)# 生成输出文件名output_file = os.path.splitext(input_file)[0] + f'.{output_format}'output_path = os.path.join(output_dir, output_file)# 导出文件if output_format == 'excel':df.to_excel(output_path, index=False)elif output_format == 'json':df.to_json(output_path, orient='records')elif output_format == 'csv':df.to_csv(output_path, index=False)

总结

进阶主题部分涵盖了:

  1. 自定义函数(函数应用、函数映射、函数优化)
  2. 高级索引(多级索引、索引操作、索引优化)
  3. 数据导出(格式转换、数据压缩、批量处理)
  4. 实际应用示例

掌握这些进阶主题对于提升 Pandas 使用水平至关重要,它可以帮助我们:

  • 提高代码效率
  • 优化数据处理
  • 增强数据导出能力
  • 提升代码质量

建议在实际项目中注意:

  • 合理使用自定义函数
  • 优化索引操作
  • 选择合适的导出格式
  • 注意数据压缩
  • 考虑批量处理
  • 保持代码可维护性
  • 持续学习新特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87415.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Boost dlib opencv vs2022 C++ 源码安装集成配置

​在进行人脸检测开发时候出现 E1696: 无法打开源文件 "dlib/image_processing/frontal_face_detector.h 解决方案 1, 下载boost 需要:https://www.boost.org/ 或github git clone --recursive https://gitee.com/luozhonghua/boost.git 记住一定要完整版源码…

rest_framework permission_classes 无效的解决方法

写了一个特别简单的view&#xff1a; csrf_exempt login_required() authentication_classes([TokenAuthentication]) permission_classes([IsAdminUser, IsAuthenticated]) def department_management_view(request):if request.method POST:department_name request.POST.…

Windows 体系对比 + 嵌入式开发全流程拆解

一、操作系统层级对比&#xff1a;Windows 家族 vs Linux 家族 角色Windows 体系Linux 体系本质核心内核Windows NT KernelLinux Kernel操作系统引擎&#xff08;管理CPU/内存/硬件&#xff09;完整操作系统Windows 11 Home/ProUbuntu / Debian / CentOS内核 界面 软件 驱动…

C# 实现 gRPC高级通信框架简单实现

1. 前言 gRPC&#xff08;Google Remote Procedure Call&#xff09;是一个高性能、开源和通用的RPC框架&#xff0c;由Google主导开发。它支持多种编程语言&#xff0c;并广泛用于构建分布式应用程序和服务。gRPC基于HTTP/2协议&#xff0c;支持双向流、请求-响应和多请求-多…

将项目推到Github

前提条件 需要安装GIT需要注册GitHub账号 步骤 首先我们需要登录我们的GITHUB账号&#xff0c;然后点击新建存储库 然后起一个名字&#xff0c;设置一些私有公开即可 创建完成之后&#xff0c;这里有可以远程推送的命令 后面就直接输出命令即可 之后推送即可 git push orig…

K8S 专栏 —— namespace和Label篇

文章目录 namespace创建namespacenamespace使用默认namespaceLabel添加Label查询Labelnamespace 命名空间是一种用于在 kubernetes 集群中划分资源的虚拟化手段,每个资源都属于一个命名空间,使得多个团队或应用可以在同一个集群中独立运行,避免资源冲突。 创建namespace y…

44.第二阶段x64游戏实战-封包-分析掉落物列表id存放位置

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;43.第二阶段x64游戏实战-封包-代码实现获取包裹物品 之前的内容找到了掉落物的…

汇编语言期末快速过手笔记

一、计算机系统组成 计算机系统组成&#xff1a;由硬件系统和软件系统组成 硬件系统&#xff1a;CPU、存储器、输入/输出设备等物理部件软件系统&#xff1a;操作系统、各种语言、系统软件和应用软件 汇编语言分类 属于低级语言&#xff08;直接面向硬件&#xff09;与高级语言…

C++相比于C语言增加了哪些概念?

C相比于C语言增加了哪些概念&#xff1f; 作者将狼才鲸创建日期2025-06-17 CSDN阅读地址&#xff1a;C相比于C语言增加了哪些概念&#xff1f;Gitee源码目录&#xff1a;qemu/demo_代码示例/02_C_Class 目标受众&#xff1a;熟悉C语言&#xff0c;对C完全不了解&#xff0c;但…

HarmonyOS5 分布式测试:断网情况支付场景异常恢复验证

以下是针对HarmonyOS 5分布式事务在断网支付场景下的异常恢复验证全流程方案&#xff0c;综合关键技术与测试策略&#xff1a; 一、核心事务机制验证 ‌两阶段提交&#xff08;2PC&#xff09;协议‌ 模拟支付流程中网络中断&#xff0c;验证事务协调者能否正确处理预提交与回滚…

【狂飙AGI】第5课:前沿技术-文生图(系列1)

目录 &#xff08;一&#xff09;绘画本质&#xff08;二&#xff09;国内外AI转绘展&#xff08;三&#xff09;创作思路&#xff08;四&#xff09;美学理论&#xff08;1&#xff09;不可能美学&#xff08;2&#xff09;趋无限美学&#xff08;3&#xff09;反物理美学&…

发那科A06B-6290-H124 伺服驱动器

‌FANUC A06B-6290-H124 伺服驱动器核心性能解析‌ ‌一、核心控制能力‌ ‌多模式精密控制‌ 位置控制‌&#xff1a;支持高精度旋转角度/直线位移调节&#xff08;分辨率达脉冲级&#xff09;&#xff0c;适用于数控机床定位&#xff08;误差0.01mm级&#xff09;和机器人轨…

Spring Boot 项目启动优化

Spring Boot 项目启动优化是一个非常重要的话题&#xff0c;尤其是在微服务和云原生环境下&#xff0c;快速启动意味着更快的部署、更高效的弹性伸缩和更好的开发体验。 下面我将从分析诊断、优化策略和终极方案三个层面&#xff0c;为你提供一个全面、可操作的优化指南。 一、…

「爬取豆瓣Top250电影的中文名称」数据采集、网络爬虫

- 第 108 篇 - Date: 2025 - 06 - 16 Author: 郑龙浩&#xff08;仟墨&#xff09; 文章目录 **任务&#xff1a;爬取豆瓣Tap250电影的中文名称****代码****实现效果** 任务&#xff1a;爬取豆瓣Tap250电影的中文名称 代码 # 豆瓣前Tap 250 import requests from bs4 import…

MySQL 多表查询、事务

1.多表查询的分类 1.1 内连接 在 MySQL 中&#xff0c;内连接&#xff08;INNER JOIN&#xff09;返回的是两个表中满足连接条件的记录的交集。这个“交集”不是指整个表&#xff0c;而是指符合连接条件的行组合&#xff0c;也就是A表和B表中满足我们使用on指定条件的记录。图…

CSP-J 2020 入门级 第一轮(初赛) 答案及解析

CSP-J 2020 入门级 第一轮&#xff08;初赛&#xff09; 答案及解析 在内存储器中每个存储单元都被赋予一个唯一的序号&#xff0c;称为&#xff08;&#xff09;。 A. 地址 B. 序号 C. 下标 D. 编号 答: A 计算机中每个存储单元都是1字节&#xff0c;都有唯一的地址。 编译器…

Flutter包管理与插件开发完全指南

Flutter作为Google推出的跨平台移动应用开发框架&#xff0c;其强大的生态系统离不开完善的包管理机制和丰富的插件支持。本文将全面介绍Flutter中的包管理体系和插件开发实践&#xff0c;帮助开发者高效管理项目依赖并扩展应用功能。 一、Flutter包管理基础 1.1 包管理概述 …

【视频直播出海】阿里云ApsaraVideo Live:从零搭建全球直播平台的“星际航行”指南!

【视频直播出海】阿里云ApsaraVideo Live&#xff1a;从零搭建全球直播平台的“星际航行”指南&#xff01; 在全球化浪潮的推动下&#xff0c;视频直播行业正以前所未有的速度跨越国界&#xff0c;成为连接世界的“数字新桥梁”。对于渴望拓展海外市场的企业而言&#xff0c;…

OAuth2中的Token

两个不同的Token OAuth2 中主要有两个不同的Token, 其中的区别为是否与用户相关联, 即与用户相关的用户Token, 和与客户端相关的客户端Token, 可以通过用户Token, 查询到用户的相关信息, 客户端Token与用户无关, 一般只用于客户端认证 用户Token 获取用户Token一般有两个方式…

使用 FastMCP 实现 Word 文档与 JSON 数据互转的 Python 服务

一、项目背景 本文分享一个基于 FastMCP 框架实现的文档处理服务&#xff0c;可实现 Word 文档&#xff08;.docx&#xff09;与 JSON 数据格式的双向转换。通过此服务&#xff0c;开发者可以轻松实现文档内容提取、结构化数据填充、样式模板复用等功能&#xff0c;适用于自动…