在pandas中更改列類型方式
在 pandas 中有四個(gè)主要選項(xiàng)來轉(zhuǎn)換類型:
to_numeric()- 提供功能以安全地將非數(shù)值類型(例如字符串)轉(zhuǎn)換為合適的數(shù)值類型。(另見to_datetime()和to_timedelta()。)astype()- (幾乎)任何類型轉(zhuǎn)換為(幾乎)任何其他類型(即使這樣做不一定合理)。還允許你將類型轉(zhuǎn)換為分類類型(非常有用)。infer_objects()- 一個(gè)實(shí)用方法,如果可能的話,將包含 Python 對象的列轉(zhuǎn)換為 pandas 類型。convert_dtypes()- DataFrame 列轉(zhuǎn)換為支持pd.NA(pandas 的對象,用于表示缺失值)的“最佳可能”數(shù)據(jù)類型。
1.to_numeric()
將非數(shù)值對象(如字符串)轉(zhuǎn)換為整數(shù)或浮點(diǎn)數(shù)的最好方法是使用 pandas 中的 to_numeric() 函數(shù)。
這個(gè)函數(shù)會嘗試將非數(shù)值對象(如字符串)轉(zhuǎn)換為適當(dāng)?shù)恼麛?shù)或浮點(diǎn)數(shù)。
基本用法
to_numeric() 的輸入可以是一個(gè) Series 或者一個(gè) DataFrame 的單列。
s = pd.Series(["8", "6", "7.5", "3", "0.9"]) # 合字符串和數(shù)值 s = pd.to_numeric(s) # 轉(zhuǎn)換為浮點(diǎn)值
可以看到,返回了一個(gè)新的 Series。你可以將其賦值給一個(gè)變量或列名以便繼續(xù)使用:
my_series = pd.to_numeric(my_series)
你也可以使用 apply() 方法來轉(zhuǎn)換 DataFrame 的多列:
df = df.apply(pd.to_numeric) # 轉(zhuǎn)換 `DataFrame` 的所有列
或者只轉(zhuǎn)換特定的列:
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
只要你的值都可以被轉(zhuǎn)換,這可能就是你需要的所有操作。
錯(cuò)誤處理
但如果有些值無法轉(zhuǎn)換為數(shù)值類型怎么辦?
to_numeric() 接受一個(gè) errors 關(guān)鍵字參數(shù),允許你強(qiáng)制非數(shù)值值為 NaN,或者簡單地忽略包含這些值的列。
以下是一個(gè)使用字符串 Series 的示例,該 Series 有對象數(shù)據(jù)類型:
s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
默認(rèn)行為是在無法轉(zhuǎn)換值時(shí)引發(fā)異常。在這種情況下,它無法處理字符串 ‘pandas’:
pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
與其失敗,我們可能希望 ‘pandas’ 被視為缺失或無效的數(shù)值,并將其轉(zhuǎn)換為 NaN,如下所示:
pd.to_numeric(s, errors='coerce')
第三個(gè)選項(xiàng)是,如果遇到無效值,則忽略操作:
pd.to_numeric(s, errors='ignore')
原始 Series 將保持不變。
最后一個(gè)選項(xiàng)特別適用于轉(zhuǎn)換整個(gè) DataFrame,但不知道哪些列可以可靠地轉(zhuǎn)換為數(shù)值類型。
在這種情況下,只需寫:
df.apply(pd.to_numeric, errors='ignore')
該函數(shù)將應(yīng)用于 DataFrame 的每一列。可以轉(zhuǎn)換為數(shù)值類型的列將被轉(zhuǎn)換,而不能轉(zhuǎn)換的列(例如,它們包含非數(shù)字字符串或日期)將保持不變。
下采樣 (Downcasting)
默認(rèn)情況下,使用 to_numeric() 換時(shí),你會得到 int64 或 float64 數(shù)據(jù)類型(或者平臺原生的任何整數(shù)寬度)。
這通常是你要的結(jié)果,但如果你想要節(jié)省內(nèi)存并使用更緊湊的數(shù)據(jù)類型,比如 float32 或 int8 么辦?
to_numeric() 給你選擇下采樣的選項(xiàng),可以轉(zhuǎn)換為 'integer'、'signed'、'unsigned' 或 'float'。以下是一個(gè)簡單的整數(shù)類型 Series 示例:
s = pd.Series([1, 2, -7])
下采樣到 'integer' 使用可以容納值的最小可能整數(shù):
pd.to_numeric(s, downcast='integer')
下采樣到 'float' 同樣選擇比正常浮點(diǎn)類型更小的類型:
pd.to_numeric(s, downcast='float')
結(jié)果將是 float32。
2.astype()
astype() 方法允許你明確指定 DataFrame 或 Series 的數(shù)據(jù)類型。它非常靈活,可以嘗試從一種類型轉(zhuǎn)換為另一種類型。
基本用法
只需選擇一個(gè)類型:你可以使用 NumPy 數(shù)據(jù)類型(例如 np.int16)、一些 Python 類型(例如 bool),或者 pandas 特定的類型(如分類數(shù)據(jù)類型)。
在你想轉(zhuǎn)換的對象上調(diào)用該方法,astype() 將嘗試并為你進(jìn)行轉(zhuǎn)換:
# 將所有 DataFrame 列轉(zhuǎn)換為 int64 類型
df = df.astype(int)
# 列 "a" 轉(zhuǎn)換為 int64 類型,將列 "b" 轉(zhuǎn)換為復(fù)數(shù)類型
df = df.astype({"a": int, "b": complex})
# 將 Series 轉(zhuǎn)換為 float16 類型
s = s.astype(np.float16)
# 將 Series 轉(zhuǎn)換為 Python 字符串
s = s.astype(str)
# 將 Series 轉(zhuǎn)換為分類類型 - 請參閱文檔以獲取更多詳細(xì)信息
s = s.astype('category')
請注意我說的是“嘗試”——如果 astype() 不知道如何轉(zhuǎn)換 Series 或 DataFrame 中的值,它將引發(fā)錯(cuò)誤。
例如,如果你有一個(gè) NaN 或 inf ,嘗試將其轉(zhuǎn)換為整數(shù)時(shí)會得到錯(cuò)誤。
從 pandas 0.20.0 開始,可以通過傳遞 errors='ignore' 來抑制此錯(cuò)誤。你的原始對象將保持不變。
注意事項(xiàng)
astype() 是強(qiáng)大的,但它有時(shí)會“錯(cuò)誤地”轉(zhuǎn)換值。例如:
>>> s = pd.Series([1, 2, -7]) >>> s 0 1 1 2 2 -7 dtype: int64
這些是小整數(shù),那么將其轉(zhuǎn)換為無符號 8 位類型以節(jié)省內(nèi)存如何?
>>> s.astype(np.uint8) 0 1 1 2 2 249 dtype: uint8
轉(zhuǎn)換成功了,但 -7 繞了一圈變成了 249(即 (2^8 - 7))!
嘗試使用 pd.to_numeric(s, downcast='unsigned') 行下采樣可能會避免這個(gè)錯(cuò)誤。
3.infer_objects()
pandas 版本 0.21.0 引入了 infer_objects() 方法,用于將 DataFrame 中具有對象數(shù)據(jù)類型的列轉(zhuǎn)換為更具體的數(shù)據(jù)類型(軟轉(zhuǎn)換)。
例如,這里有一個(gè) DataFrame,包含兩列對象類型。一列持有實(shí)際的整數(shù),另一列持有表示整數(shù)的字符串:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3', '2', '1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
使用 infer_objects(),你可以將列 ‘a’ 的類型更改為 int64:
>>> df = df.infer_objects() >>> df.dtypes a int64 b object dtype: object
列 ‘b’ 保持不變,因?yàn)槠渲凳亲址皇钦麛?shù)。如果你想強(qiáng)制將兩列都轉(zhuǎn)換為整數(shù)類型,可以使用 df.astype(int)。
4.convert_dtypes()
版本 1.0 及以上包括一個(gè)方法 convert_dtypes(),用于將 Series 和 DataFrame 列轉(zhuǎn)換為支持 pd.NA 缺失值的最佳可能數(shù)據(jù)類型。
這里的“最佳可能”是指最適合存儲這些值的數(shù)據(jù)類型。例如,如果所有值都是整數(shù)(或缺失值),則會轉(zhuǎn)換為 pandas 整數(shù)類型;如果 Python 整數(shù)對象的列被轉(zhuǎn)換為 Int64,NumPy int32 值的列將變?yōu)?pandas 數(shù)據(jù)類型 Int32。
對于我們的對象 DataFrame df,我們得到以下結(jié)果:
>>> df.convert_dtypes().dtypes a Int64 b string dtype: object
由于列 ‘a’ 包含整數(shù)值,因此被轉(zhuǎn)換為 Int64 類型(能夠存儲缺失值,與 int64 不同)。
列 ‘b’ 包含字符串對象,因此被轉(zhuǎn)換為 pandas string 類型。
默認(rèn)情況下,此方法會從每列的對象值推斷類型。我們可以通過傳遞 infer_objects=False 來更改這一點(diǎn):
>>> df.convert_dtypes(infer_objects=False).dtypes a object b string dtype: object
現(xiàn)在列 ‘a’ 仍然是一個(gè)對象列:pandas 知道它可以被描述為一個(gè)整數(shù)列(內(nèi)部運(yùn)行了 infer_dtype),但沒有推斷出它應(yīng)該具有的確切數(shù)據(jù)類型,因此沒有轉(zhuǎn)換它。列 ‘b’ 再次被轉(zhuǎn)換為 string 類型,因?yàn)樗蛔R別為持有字符串值。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python并發(fā)編程多進(jìn)程 互斥鎖原理解析
這篇文章主要介紹了python并發(fā)編程多進(jìn)程 互斥鎖原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python功能點(diǎn)實(shí)現(xiàn):函數(shù)級/代碼塊級計(jì)時(shí)器
今天小編就為大家分享一篇關(guān)于Python功能點(diǎn)實(shí)現(xiàn):函數(shù)級/代碼塊級計(jì)時(shí)器,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
解決Django后臺ManyToManyField顯示成Object的問題
今天小編就為大家分享一篇解決Django后臺ManyToManyField顯示成Object的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
跟老齊學(xué)Python之私有函數(shù)和專有方法
這篇文章是老齊學(xué)Python系列文章的一篇,主要介紹了跟私有函數(shù)和專有方法,需要的朋友可以參考下2014-10-10
Python實(shí)現(xiàn)二叉排序樹與平衡二叉樹的示例代碼
樹表查詢即借助具有特殊性質(zhì)的樹數(shù)據(jù)結(jié)構(gòu)進(jìn)行關(guān)鍵字查找,本文所涉及到的特殊結(jié)構(gòu)性質(zhì)的樹包括:二叉排序樹、平衡二叉樹。文中詳細(xì)介紹了二者的實(shí)現(xiàn)代碼,需要的可以參考一下2022-04-04

