一、dtype 参数概述

dtype 参数用于指定列的数据类型,在读取 Excel 时非常重要,可以:

  • 提高内存效率
  • 避免自动类型推断错误
  • 确保数据一致性
  • 提升读取性能

二、基本用法

1. 基础语法
import pandas as pd# 指定列数据类型
df = pd.read_excel('data.xlsx', dtype={'ID': 'int32','Name': 'string','Age': 'int8','Salary': 'float32'
})
2. 查看数据类型
# 查看数据类型
print(df.dtypes)# 输出示例:
# ID          int32
# Name       string
# Age          int8
# Salary    float32
# dtype: object

三、常用的 dtype 类型

1. 数值类型
dtype_mapping = {# 整数类型'small_int': 'int8',      # -128 到 127'medium_int': 'int16',    # -32768 到 32767  'normal_int': 'int32',    # -2147483648 到 2147483647'large_int': 'int64',     # 非常大的整数# 无符号整数'tiny_uint': 'uint8',     # 0 到 255'small_uint': 'uint16',   # 0 到 65535'medium_uint': 'uint32',  # 0 到 4294967295'large_uint': 'uint64',   # 非常大的无符号整数# 浮点数类型'small_float': 'float32', # 单精度浮点数'normal_float': 'float64' # 双精度浮点数(默认)
}
2. 文本和分类类型
dtype_mapping = {'name_col': 'string',     # Pandas 字符串类型(推荐)'category_col': 'category', # 分类数据,节省内存'text_col': 'object'      # Python 对象类型(传统方式)
}
3. 布尔类型
dtype_mapping = {'is_active': 'bool',      # 布尔类型'status': 'boolean'       # 可空布尔类型(Pandas 1.0+)
}
4. 日期时间类型
dtype_mapping = {'date_col': 'datetime64[ns]',  # 日期时间'date_only': 'datetime64[D]',  # 仅日期'time_delta': 'timedelta64[ns]' # 时间间隔
}

四、实际应用示例

1. 基本数据类型指定
# 读取Excel并指定数据类型
df = pd.read_excel('employees.xlsx', dtype={'employee_id': 'int32',       # 32位整数'name': 'string',             # 字符串类型'age': 'int8',                # 8位整数'salary': 'float32',          # 单精度浮点数'department': 'category',     # 分类数据'is_manager': 'bool',         # 布尔值'hire_date': 'datetime64[ns]' # 日期时间
})
2. 处理大型数据集的优化
# 对于大型Excel文件,使用适当的数据类型可以显著减少内存使用
df = pd.read_excel('large_data.xlsx', dtype={'id': 'int32',           # 使用32位而不是64位整数'score': 'float32',      # 单精度浮点数'category': 'category',  # 分类数据,大幅节省内存'description': 'string'  # 使用Pandas字符串类型
})print(f"内存使用: {df.memory_usage(deep=True).sum() / 1024 / 1024:.2f} MB")
3. 处理混合类型列
# 当列中包含混合类型时,强制指定类型
df = pd.read_excel('mixed_data.xlsx', dtype={'numeric_code': 'string',  # 数字代码作为字符串处理'percentage': 'float64',   # 百分比作为浮点数'flag': 'int8'             # 标志位作为小整数
})

五、特殊场景处理

1. 处理缺失值
# 使用可空整数类型(Pandas 1.0+)
df = pd.read_excel('data_with_nulls.xlsx', dtype={'age': 'Int32',    # 可空32位整数(首字母大写)'score': 'Float64' # 可空64位浮点数
})# 传统方式:先读取,后转换
df = pd.read_excel('data.xlsx')
df['age'] = df['age'].astype('Int32')
2. 分类数据优化
# 对于有限取值的列,使用category类型
df = pd.read_excel('sales_data.xlsx', dtype={'product_category': 'category',  # 产品类别'region': 'category',           # 地区'payment_method': 'category'    # 支付方式
})# 查看分类信息
print(df['product_category'].cat.categories)
3. 日期时间处理
# 方法1:在读取时指定类型
df = pd.read_excel('events.xlsx', dtype={'event_date': 'datetime64[ns]'
})# 方法2:使用parse_dates参数(更推荐)
df = pd.read_excel('events.xlsx', parse_dates=['event_date'])# 方法3:读取后转换
df = pd.read_excel('events.xlsx')
df['event_date'] = pd.to_datetime(df['event_date'])

六、错误处理和调试

1. 类型转换错误处理
try:df = pd.read_excel('data.xlsx', dtype={'numeric_column': 'int32'})
except Exception as e:print(f"类型转换错误: {e}")# 回退方案:先以object类型读取,然后手动转换df = pd.read_excel('data.xlsx', dtype={'numeric_column': 'object'})df['numeric_column'] = pd.to_numeric(df['numeric_column'], errors='coerce')
2. 调试数据类型问题
# 首先以默认方式读取,查看推断的数据类型
df_sample = pd.read_excel('data.xlsx', nrows=100)
print("自动推断的数据类型:")
print(df_sample.dtypes)# 查看每列的唯一值数量,帮助决定是否使用category类型
for col in df_sample.columns:unique_count = df_sample[col].nunique()print(f"{col}: {unique_count} 个唯一值")if unique_count < 50:  # 如果唯一值较少,考虑使用categoryprint(f"  → 建议使用 'category' 类型")
3. 内存使用分析
# 比较不同数据类型的内存使用
df_object = pd.read_excel('data.xlsx')  # 默认object类型
df_optimized = pd.read_excel('data.xlsx', dtype={'id': 'int32','category_col': 'category','numeric_col': 'float32'
})print("默认类型内存使用:", df_object.memory_usage(deep=True).sum() / 1024 / 1024, "MB")
print("优化后内存使用:", df_optimized.memory_usage(deep=True).sum() / 1024 / 1024, "MB")
print("内存节省:", (1 - df_optimized.memory_usage(deep=True).sum() / df_object.memory_usage(deep=True).sum()) * 100, "%")

七、最佳实践建议

1. 数据类型选择策略
# 根据数据特征选择合适的数据类型
dtype_strategy = {'ID列': 'int32',          # 标识符使用32位整数'年龄': 'int8',           # 小范围整数使用8位'价格': 'float32',        # 价格使用单精度浮点数'分类列': 'category',     # 有限取值的列使用分类'文本列': 'string',       # 文本使用字符串类型'标志列': 'bool',         # 布尔值使用bool类型'日期列': 'datetime64[ns]' # 日期时间类型
}
2. 性能优化技巧
# 分批读取大型文件
chunk_size = 10000
dtype_dict = {'col1': 'int32', 'col2': 'category'}chunks = []
for chunk in pd.read_excel('large_file.xlsx', dtype=dtype_dict, chunksize=chunk_size):# 处理每个数据块chunks.append(chunk)df = pd.concat(chunks, ignore_index=True)
3. 可维护性建议
# 将数据类型配置单独管理
DATA_TYPE_MAPPING = {'employee_id': 'int32','name': 'string', 'department': 'category','salary': 'float32','hire_date': 'datetime64[ns]','is_active': 'bool'
}# 使用配置读取数据
df = pd.read_excel('employees.xlsx', dtype=DATA_TYPE_MAPPING)

八、常见问题解决方案

1. 数字前导零问题
# 将数字列作为字符串读取,保留前导零
df = pd.read_excel('product_codes.xlsx', dtype={'product_code': 'string'  # 如 "00123" 而不是 123
})
2. 大数字精度问题
# 对于大数字,使用字符串避免精度损失
df = pd.read_excel('big_numbers.xlsx', dtype={'big_id': 'string',      # 如身份证号、长数字ID'phone_number': 'string' # 电话号码
})
3. 混合数据类型列
# 对于包含混合类型的列,先以object读取,然后清理
df = pd.read_excel('mixed_types.xlsx', dtype={'problem_column': 'object'})# 然后进行数据清洗和类型转换
def clean_mixed_column(column):try:return pd.to_numeric(column, errors='raise')except:return column  # 保持原样或进行其他处理df['cleaned_column'] = df['problem_column'].apply(clean_mixed_column)

总结

数据类型使用场景优点注意事项
int8/16/32/64整数数据节省内存确保数据在范围内
float32/64小数数据精度控制注意精度损失
string文本数据字符串操作优化Pandas 1.0+
category有限取值大幅节省内存适合低基数数据
bool布尔值内存高效只能True/False
datetime64日期时间时间序列操作格式要一致

通过合理使用 dtype 参数,可以显著提高 Pandas 读取 Excel 文件的效率和可靠性。

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

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

相关文章

gtest全局套件的测试使用

gtest全局套件的测试使用 #include <iostream> #include "gtest/gtest.h" #include <unordered_map>class MyEnvironment: public testing::Environment {public:virtual void SetUp() override{std::cout<<"单元测试前的环境初始化&#xff…

【系统分析师】第7章-基础知识:软件工程(核心总结)

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 一、软件工程的基本概念 1.1 定义与意义 1.2 软件工程的基本原则 1.3 核心定义与边界 1.4 四大核心原则 1.5 三大核心目标 二、软件生命周期 2.1 定义与阶段划分 2.2 软件生命周期模型 三、软件开发方法 3.1 结构化方法…

量化基金从小白到大师 - 金融数据获取大全:从免费API到Tick级数据实战指南

量化基金从小白到大师 - 金融数据获取大全&#xff1a;从免费API到Tick级数据实战指南 各位&#xff0c;今天咱们要啃一块硬骨头——金融数据获取。别看这话题基础&#xff0c;它可是整个量化大厦的地基&#xff0c;地基不稳&#xff0c;再牛的策略都得塌房。我见过太多人&…

构建一个“会思考”的房地产数据获取脚本

—— 跨界思维&#xff1a;从认知自适应到房源信息监测 一、认知科学视角&#xff1a;什么是“会思考” 在心理学与认知科学中&#xff0c;所谓“会思考”&#xff0c;并不是指抽象的哲学推理&#xff0c;而是指个体能在复杂环境中不断调整行动策略。 比如&#xff0c;出行时如…

JavaScript的库简介

JavaScript拥有丰富的库生态系统,类似于Python的requests、numpy或C++的Boost。这些库分为两大类:前端库(如React、Vue)和后端/工具库(如Lodash、Axios)。以下是几个核心库的介绍与用法示例。 常用JavaScript库分类 前端UI库 React:Facebook开发的组件化库,用于构建用…

【无GGuF版本】如何在Colab下T4运行gpt-oss 20B

OpenAI发布了gpt-oss 120B和20B版本。这两个模型均采用Apache 2.0许可证。 特别说明的是&#xff0c;gpt-oss-20b专为低延迟及本地化/专业化场景设计&#xff08;210亿总参数&#xff0c;36亿活跃参数&#xff09;。 由于模型采用原生MXFP4量化训练&#xff0c;使得20B版本即…

LeetCode - LCR 179. 查找总价格为目标值的两个商品

题目 https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/submissions/660817798/ 思路 解法1是暴力解法&#xff0c;从第一个开始和后面的相加 暴力枚举慢就慢在&#xff0c;这个递增数组是排序好的数组&#xff0c;已经是有序的&#xff0c;暴力解法没有利用这…

UI自动化测试Python + Selenium + WinAppDriver( Windows 桌面应用)落地(一)环境搭建

最近公司要求为Windows 端桌面应用进行UI自动化测试,之前都是针对web端进行的UI自动化测试或者在早期使用的是QTP(Quick Test Professional)做PC端的UI自动化测试,而基于"经费"紧张,优先选择开源的工具,所以选择了selenium + WinAppDriver来实现。 首先,整理…

基于OpenCV的银行卡号识别系统:从原理到实现

引言在现代金融科技应用中&#xff0c;银行卡号的自动识别是一项重要技术。本文将详细介绍如何使用Python和OpenCV库构建一个完整的银行卡号识别系统。该系统能够从银行卡图像中提取卡号信息&#xff0c;并根据卡号首数字判断银行卡类型。技术栈​OpenCV: 计算机视觉库&#xf…

概率论第三讲——多维随机变量及其分布

文章目录考纲n维随机变量及其分布函数联合分布函数边缘分布函数二维离散型随机变量的概率分布、边缘分布和条件分布二维连续型随机变量的概率密度、边缘概率密度和条件概率密度常见的二位分布二维均匀分布二维正态分布随机变量的相互独立性概念相互独立的充要条件相互独立的性质…

纯软件实现电脑屏幕录制/存储到硬盘录像机/onvif模拟器/onvif虚拟监控/绿色版双击开箱即用

一、前言说明 在银行、超市、考试中心、工控系统、网课教学、居家办公等场景中&#xff0c;传统监控摄像头难以清晰录制电脑屏幕内容&#xff0c;导致关键操作无法有效追溯。为解决这一难题&#xff0c;我们推出了一套纯软件实现的电子屏幕监控方案&#xff0c;彻底取代依赖硬…

【算法--链表】86.分割链表--通俗讲解

一、题目是啥?一句话说清 给你一个链表和一个值 x,把链表分成两部分:所有小于 x 的节点都放在大于或等于 x 的节点之前,并且保持节点原来的相对顺序。 示例: 输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5](所有小于3的节点1、2、2都在大于等于3的节点4、3、5…

707, 设计链表, LinkedList, 单链表, Dummy Head, C++

目录 题意速览解题思路与设计要点C 代码实现&#xff08;单链表 虚拟头结点&#xff09;时间复杂度与空间复杂度常见坑位与边界用例对比&#xff1a;双链表如何优化单元测试样例&#xff08;可直接粘贴运行&#xff09;总结 题意速览 设计一个支持如下操作的链表&#xff1a…

NAS自建笔记服务leanote2

leanote2(GitHub - wiselike/leanote2: leanote2, 适用于NAS自建的笔记服务) 是一个开源的在线笔记应用程序&#xff0c;继承自原 leanote 项目。向原 leanote 的开发者表示深深的感谢与尊重&#xff0c;正是他们的辛勤付出奠定了这个优秀的笔记平台的基础。 但由于 leanote 项…

模型剪枝----ResNet18剪枝实战

剪枝 模型剪枝&#xff08;Model Pruning&#xff09; 是一种 模型压缩&#xff08;Model Compression&#xff09; 技术&#xff0c;主要思想是&#xff1a; 深度神经网络里有很多 冗余参数&#xff08;对预测结果贡献很小&#xff09;。 通过去掉这些冗余连接/通道/卷积核&am…

K8S-Pod(上)

Pod概念 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod是一组&#xff08;一个或多个&#xff09;容器&#xff1b;这些容器共享存储、网络、以及怎样运行这些容器的规约。Pod 中的内容总是并置&#xff08;colocated&#xff09;的并且一同调度&am…

Flink TaskManager日志时间与实际时间有偏差

Flink 启动一个任务后&#xff0c;发现TaskManager上日志时间与实际时间相差约 15 小时。 核心原因可能是&#xff1a; 1、 服务器&#xff08;或容器&#xff09;的系统时间配置错误2、 Flink 日志组件&#xff08;如 Logback/Log4j&#xff09;的时间配置未使用系统默认时区…

Webug3.0通关笔记18 中级进阶第06关 实战练习:DisCuz论坛SQL注入漏洞

目录 一、环境搭建 1、服务启动 2、源码解压 3、构造访问靶场URL 4、靶场安装 5、访问论坛首页 二、代码分析 1、源码分析 2、SQL注入分析 三、渗透实战 &#xff08;1&#xff09;判断是否有SQL注入风险 &#xff08;2&#xff09;查询账号密码 Discuz! 作为国内知…

SWEET:大语言模型的选择性水印

摘要背景与问题大语言模型出色的生成能力引发了伦理与法律层面的担忧&#xff0c;于是通过嵌入水印来检测机器生成文本的方法逐渐发展起来。但现有工作在代码生成任务中无法良好发挥作用&#xff0c;原因在于代码生成任务本身的特性&#xff08;代码有其特定的语法、逻辑结构&a…

FastDFS V6双IP特性及配置

FastDFS V6.0开始支持双IP&#xff0c;tracker server和storage server均支持双IP。V6.0新增特性说明如下&#xff1a;支持双IP&#xff0c;一个内网IP&#xff0c;一个外网IP&#xff0c;可以支持NAT方式的内网和外网两个IP&#xff0c;解决跨机房或混合云部署问题。FastDFS双…