【Python自動化】 21.2 Pandas 讀取 Excel 時的 dtype 參數完全指南

一、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雙…