Python?Pandas中數(shù)據(jù)類(lèi)型查看與轉(zhuǎn)換方法
1. 引言
在數(shù)據(jù)分析工作中,正確處理數(shù)據(jù)類(lèi)型是確保分析結(jié)果準(zhǔn)確性的基礎(chǔ)。Pandas提供了豐富的數(shù)據(jù)類(lèi)型系統(tǒng)以及靈活的類(lèi)型轉(zhuǎn)換方法。本文將詳細(xì)介紹如何查看Pandas數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類(lèi)型,以及如何進(jìn)行有效的類(lèi)型轉(zhuǎn)換。
2. 數(shù)據(jù)類(lèi)型查看方法
2.1 查看Series/DataFrame的數(shù)據(jù)類(lèi)型
import pandas as pd
import numpy as np
# 創(chuàng)建示例DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Salary': [50000.0, 60000.5, 70000.0],
'Join_Date': pd.to_datetime(['2020-01-15', '2019-05-20', '2021-11-10']),
'Is_Manager': [True, False, True]
}
df = pd.DataFrame(data)
# 查看整個(gè)DataFrame的數(shù)據(jù)類(lèi)型
print(df.dtypes)
"""
Name object
Age int64
Salary float64
Join_Date datetime64[ns]
Is_Manager bool
dtype: object
"""
# 查看單列的數(shù)據(jù)類(lèi)型
print(df['Age'].dtype) # 輸出: int64
解釋說(shuō)明:
- dtypes屬性返回DataFrame每列的數(shù)據(jù)類(lèi)型
- 對(duì)于Series,使用dtype屬性獲取其數(shù)據(jù)類(lèi)型
- Pandas常見(jiàn)數(shù)據(jù)類(lèi)型包括:object(字符串)、int64(整數(shù))、float64(浮點(diǎn)數(shù))、datetime64(日期時(shí)間)、bool(布爾值)等
2.2 查看DataFrame內(nèi)存使用情況
# 查看各列內(nèi)存使用量 print(df.memory_usage()) """ Index 128 Name 24 Age 24 Salary 24 Join_Date 24 Is_Manager 3 dtype: int64 """ # 查看詳細(xì)內(nèi)存使用情況(deep=True會(huì)計(jì)算object類(lèi)型的真實(shí)內(nèi)存使用) print(df.memory_usage(deep=True)) """ Index 128 Name 174 Age 24 Salary 24 Join_Date 24 Is_Manager 3 dtype: int64 """
應(yīng)用場(chǎng)景:處理大型數(shù)據(jù)集時(shí)優(yōu)化內(nèi)存使用。
3. 數(shù)據(jù)類(lèi)型轉(zhuǎn)換方法
3.1 使用astype()進(jìn)行類(lèi)型轉(zhuǎn)換
# 將Age從int64轉(zhuǎn)換為float64
df['Age'] = df['Age'].astype('float64')
print(df['Age'].dtype) # 輸出: float64
# 將Salary從float64轉(zhuǎn)換為int64(會(huì)截?cái)嘈?shù)部分)
df['Salary'] = df['Salary'].astype('int64')
print(df['Salary'])
"""
0 50000
1 60000
2 70000
Name: Salary, dtype: int64
"""
# 將Is_Manager從bool轉(zhuǎn)換為str
df['Is_Manager'] = df['Is_Manager'].astype('str')
print(df['Is_Manager'].dtype) # 輸出: object
注意事項(xiàng):
- 轉(zhuǎn)換到較小范圍類(lèi)型可能導(dǎo)致數(shù)據(jù)丟失(如float轉(zhuǎn)int會(huì)截?cái)嘈?shù))
- 無(wú)法轉(zhuǎn)換時(shí)會(huì)拋出異常(如將非數(shù)字字符串轉(zhuǎn)為數(shù)值類(lèi)型)
3.2 轉(zhuǎn)換為分類(lèi)數(shù)據(jù)(category)
# 將Name列轉(zhuǎn)換為分類(lèi)類(lèi)型
df['Name'] = df['Name'].astype('category')
print(df['Name'].dtype) # 輸出: category
# 查看分類(lèi)的類(lèi)別
print(df['Name'].cat.categories)
"""
Index(['Alice', 'Bob', 'Charlie'], dtype='object')
"""
# 分類(lèi)類(lèi)型的內(nèi)存節(jié)省效果
print(f"原始內(nèi)存: {df['Name'].memory_usage(deep=True)}")
df['Name'] = df['Name'].astype('object')
print(f"轉(zhuǎn)換后內(nèi)存: {df['Name'].memory_usage(deep=True)}")
"""
原始內(nèi)存: 174
轉(zhuǎn)換后內(nèi)存: 180
"""
應(yīng)用場(chǎng)景:當(dāng)列中重復(fù)值很多時(shí),使用category類(lèi)型可以顯著節(jié)省內(nèi)存。
3.3 日期時(shí)間轉(zhuǎn)換
# 字符串轉(zhuǎn)換為日期時(shí)間 date_str = pd.Series(['2023-01-01', '2023-02-15', '2023-03-20']) dates = pd.to_datetime(date_str) print(dates.dtype) # 輸出: datetime64[ns] # 處理多種日期格式 mixed_dates = pd.Series(['01-01-2023', '2023/02/15', '15-March-2023']) dates = pd.to_datetime(mixed_dates) print(dates) """ 0 2023-01-01 1 2023-02-15 2 2023-03-15 dtype: datetime64[ns] """ # 提取日期組成部分 df['Year'] = df['Join_Date'].dt.year df['Month'] = df['Join_Date'].dt.month print(df[['Join_Date', 'Year', 'Month']]) """ Join_Date Year Month 0 2020-01-15 2020 1 1 2019-05-20 2019 5 2 2021-11-10 2021 11 """
3.4 使用pd.to_numeric()進(jìn)行數(shù)值轉(zhuǎn)換
# 創(chuàng)建包含數(shù)字字符串和缺失值的Series mixed_data = pd.Series(['1', '2.5', '3.0', 'four', None]) # 安全轉(zhuǎn)換為數(shù)值(無(wú)法轉(zhuǎn)換的設(shè)為NaN) numeric_data = pd.to_numeric(mixed_data, errors='coerce') print(numeric_data) """ 0 1.0 1 2.5 2 3.0 3 NaN 4 NaN dtype: float64 """ # 向下轉(zhuǎn)換為最小可能類(lèi)型 numeric_data = pd.to_numeric(mixed_data, errors='coerce', downcast='integer') print(numeric_data) """ 0 1.0 1 2.5 2 3.0 3 NaN 4 NaN dtype: float32 """
優(yōu)勢(shì):比astype()更安全,可以處理混合類(lèi)型數(shù)據(jù)。
4. 特殊類(lèi)型轉(zhuǎn)換技巧
4.1 使用infer_objects()自動(dòng)推斷類(lèi)型
# 創(chuàng)建類(lèi)型不明確的數(shù)據(jù)
df_mixed = pd.DataFrame({
'A': [1, 2, 3],
'B': ['4', '5', '6'],
'C': [True, False, True]
})
# 自動(dòng)推斷更合適的類(lèi)型
df_inferred = df_mixed.infer_objects()
print(df_inferred.dtypes)
"""
A int64
B object
C bool
dtype: object
"""
4.2 使用convert_dtypes()轉(zhuǎn)換到最佳類(lèi)型
# 轉(zhuǎn)換為支持pd.NA的最佳類(lèi)型 df_best = df.convert_dtypes() print(df_best.dtypes) """ Name string Age Int64 Salary Int64 Join_Date datetime64[ns] Is_Manager boolean Year Int64 Month Int64 dtype: object """
說(shuō)明:該方法會(huì)嘗試轉(zhuǎn)換為支持缺失值的最佳類(lèi)型(如StringDtype、Int64等)。
4.3 自定義轉(zhuǎn)換函數(shù)
# 使用apply進(jìn)行自定義轉(zhuǎn)換
def convert_salary(salary):
if salary > 60000:
return 'High'
elif salary > 50000:
return 'Medium'
else:
return 'Low'
df['Salary_Level'] = df['Salary'].apply(convert_salary)
print(df[['Salary', 'Salary_Level']])
"""
Salary Salary_Level
0 50000 Low
1 60000 Medium
2 70000 High
"""
5. 類(lèi)型轉(zhuǎn)換的最佳實(shí)踐
轉(zhuǎn)換前先檢查:使用dtypes查看當(dāng)前類(lèi)型
處理缺失值:轉(zhuǎn)換前處理好缺失值,否則可能導(dǎo)致意外結(jié)果
選擇合適類(lèi)型:根據(jù)數(shù)據(jù)特征選擇最節(jié)省內(nèi)存的類(lèi)型
使用安全轉(zhuǎn)換:優(yōu)先考慮pd.to_numeric()等安全轉(zhuǎn)換方法
測(cè)試轉(zhuǎn)換結(jié)果:轉(zhuǎn)換后驗(yàn)證數(shù)據(jù)是否符合預(yù)期
分類(lèi)數(shù)據(jù)優(yōu)化:對(duì)低基數(shù)列使用category類(lèi)型節(jié)省內(nèi)存
大文件處理:讀取大文件時(shí)指定dtypes參數(shù)優(yōu)化內(nèi)存
# 讀取CSV時(shí)指定數(shù)據(jù)類(lèi)型
dtype_spec = {
'user_id': 'int32',
'product_id': 'category',
'rating': 'float32'
}
# pd.read_csv('large_file.csv', dtype=dtype_spec)
6. 總結(jié)
1.數(shù)據(jù)類(lèi)型查看:
- dtypes查看DataFrame各列類(lèi)型
- dtype查看Series類(lèi)型
- memory_usage分析內(nèi)存占用
2.類(lèi)型轉(zhuǎn)換方法:
- astype()基本類(lèi)型轉(zhuǎn)換
- pd.to_datetime()日期時(shí)間轉(zhuǎn)換
- pd.to_numeric()安全數(shù)值轉(zhuǎn)換
- category類(lèi)型節(jié)省內(nèi)存
- convert_dtypes()自動(dòng)選擇最佳類(lèi)型
3.高級(jí)技巧:
- 自定義轉(zhuǎn)換函數(shù)
- 讀取數(shù)據(jù)時(shí)指定類(lèi)型
- 使用分類(lèi)數(shù)據(jù)優(yōu)化性能
正確理解和處理Pandas數(shù)據(jù)類(lèi)型是數(shù)據(jù)預(yù)處理的關(guān)鍵步驟。合理的數(shù)據(jù)類(lèi)型不僅能保證計(jì)算正確性,還能顯著提高內(nèi)存使用效率和計(jì)算速度。掌握這些類(lèi)型查看與轉(zhuǎn)換技巧,將使你的數(shù)據(jù)分析工作更加高效可靠。
在實(shí)際工作中,建議:
- 數(shù)據(jù)導(dǎo)入后首先檢查各列數(shù)據(jù)類(lèi)型
- 根據(jù)分析需求轉(zhuǎn)換到合適類(lèi)型
- 處理大型數(shù)據(jù)時(shí)特別注意類(lèi)型對(duì)內(nèi)存的影響
- 建立數(shù)據(jù)類(lèi)型檢查的標(biāo)準(zhǔn)化流程
到此這篇關(guān)于Python Pandas中數(shù)據(jù)類(lèi)型查看與轉(zhuǎn)換方法的文章就介紹到這了,更多相關(guān)Pandas數(shù)據(jù)類(lèi)型查看與轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Pandas數(shù)據(jù)類(lèi)型自行變換及數(shù)據(jù)類(lèi)型轉(zhuǎn)換失敗問(wèn)題分析與解決
- Pandas中Series的創(chuàng)建及數(shù)據(jù)類(lèi)型轉(zhuǎn)換
- Pandas數(shù)據(jù)類(lèi)型轉(zhuǎn)換df.astype()及數(shù)據(jù)類(lèi)型查看df.dtypes的使用
- pandas 數(shù)據(jù)類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)
- Pandas實(shí)現(xiàn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換的一些小技巧匯總
相關(guān)文章
Python?Jinja2?庫(kù)靈活性廣泛性應(yīng)用場(chǎng)景實(shí)例解析
Jinja2,作為Python中最流行的模板引擎之一,為開(kāi)發(fā)者提供了強(qiáng)大的工具,用于在Web應(yīng)用和其他項(xiàng)目中生成動(dòng)態(tài)內(nèi)容,本文將深入研究?Jinja2?庫(kù)的各個(gè)方面,提供更豐富的示例代碼,能夠充分理解其靈活性和廣泛應(yīng)用的場(chǎng)景2024-01-01
解決python中import文件夾下面py文件報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了解決python中import文件夾下面py文件報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python中filter與lambda的結(jié)合使用詳解
今天小編就為大家分享一篇Python中filter與lambda的結(jié)合使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python視頻轉(zhuǎn)化字節(jié)問(wèn)題的完整實(shí)現(xiàn)
在Python中可以將視頻和字節(jié)進(jìn)行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于python視頻轉(zhuǎn)化字節(jié)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Python實(shí)現(xiàn)對(duì)相同數(shù)據(jù)分箱的小技巧分享
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)對(duì)相同數(shù)據(jù)分箱的小技巧,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python寫(xiě)文件時(shí)覆蓋原來(lái)的實(shí)例方法
這篇文章主要介紹了python寫(xiě)文件時(shí)覆蓋原來(lái)的實(shí)例方法,對(duì)此有興趣的朋友們可以參考下。2020-07-07
在PyCharm中實(shí)現(xiàn)關(guān)閉一個(gè)死循環(huán)程序的方法
今天小編就為大家分享一篇在PyCharm中實(shí)現(xiàn)關(guān)閉一個(gè)死循環(huán)程序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
python 列表,數(shù)組和矩陣sum的用法及區(qū)別介紹
今天小編就為大家分享一篇python 列表,數(shù)組和矩陣sum的用法及區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python多分支語(yǔ)句的三種結(jié)構(gòu)詳解
這篇文章主要介紹了Python多分支語(yǔ)句的三種結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

