【Python】Pandas 数据类型概述与转换实战
在進行數據分析時,確保使用正確的數據類型是很重要的,否則我們可能會得到意想不到的結果或甚至是錯誤結果。對于 pandas 來說,它會在許多情況下自動推斷出數據類型
盡管 pandas 已經自我推斷的很好了,但在我們的數據分析過程中,可能仍然需要顯式地將數據從一種類型轉換為另一種類型。本文將討論基本的 pandas 數據類型(又名 dtypes ),它們如何映射到 python 和 numpy 數據類型,以及從一種 pandas 類型轉換為另一種的方法
Pandas 數據類型
數據類型本質上是編程語言用來理解如何存儲和操作數據的內部結構。例如,一個程序需要理解將兩個數字相加,如 5 + 10 得到 15。或者有兩個字符串,如“cat”和“hat”,可以將它們連接(加)在一起得到“cathat”
關于 pandas 數據類型的一個可能令人困惑的地方是 pandas、python 和 numpy 之間存在一些出入
下表做了相關的總結
| object | str or mixed | string_, unicode_, mixed types | Text or mixed numeric and non-numeric values |
| int64 | int | int_, int8, int16, int32, int64, uint8, uint16, uint32, uint64 | Integer numbers |
| float64 | float | float_, float16, float32, float64 | Floating point numbers |
| bool | bool | bool_ | True/False values |
| datetime64 | NA | datetime64[ns] | Date and time values |
| timedelta[ns] | NA | NA | Differences between two datetimes |
| category | NA | NA | Finite list of text values |
不過在大多數情況下,無需擔心是否應該嘗試顯式地將 pandas 類型強制為對應于 NumPy 類型。大多數時候,使用 pandas 默認的 int64 和 float64 類型就可以了
下面我們將重點介紹以下 pandas 類型:
object
int64
float64
datetime64
bool
而對于category 和 timedelta 類型,我們會在后面的文章中重點介紹
還需要注意的是object數據類型實際上可以包含多種不同的類型。例如,a 列可以包括整數、浮點數和字符串,它們統稱為object。因此,我們可能需要一些額外的技術來處理object列中的混合數據類型,我們也在后面的文章專門討論
下面我們先來查看本文使用的測試數據
import?numpy?as?np import?pandas?as?pddf?=?pd.read_csv("sales_data_types.csv")Output:
乍一看數據好像還不錯,所以我們可以嘗試做一些操作來分析數據。讓我們嘗試將 2016 年和 2017 年的銷售額相加:
df['2016']?+?df['2017']Output:
0 $125,000.00$162500.00 1 $920,000.00$101,2000.00 2 $50,000.00$62500.00 3 $350,000.00$490000.00 4 $15,000.00$12750.00 dtype: object結果顯然不是我們期望的,我們希望將總數加在一起,但 pandas 只是將兩個值連接在一起。其實問題也很明顯,我們的數據類型是dtype: object ,object 是 pandas 中的字符串,因此它執行字符串操作而不是數學操作
我們可以通過如下代碼查看數據所有的數據類型信息
df.dtypesOutput:
Customer Number float64 Customer Name object 2016 object 2017 object Percent Growth object Jan Units object Month int64 Day int64 Year int64 Active object dtype: object當然我們還可以使用df.info()來查看更多信息
df.info()Output:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 10 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 Customer Number 5 non-null float641 Customer Name 5 non-null object 2 2016 5 non-null object 3 2017 5 non-null object 4 Percent Growth 5 non-null object 5 Jan Units 5 non-null object 6 Month 5 non-null int64 7 Day 5 non-null int64 8 Year 5 non-null int64 9 Active 5 non-null object dtypes: float64(1), int64(3), object(6) memory usage: 528.0+ bytes以上都是 Pandas 為我們自動分配的數據類型,有幾個問題:
Customer Number 是 float64 但應該是 int64
2016 和 2017 列存儲為 object,而不是諸如 float64 或 int64 之類的數值
百分比增長和 Month 單位也存儲為 object 而不是數值
列 Month 、 Day 和 Year 應轉換為 datetime64 類型
Active 列應該是一個布爾值
也就是說,在我們進行數據分析之前,我們必須手動更正這些數據類型
在 pandas 中轉換數據類型,有三個基本選項:
使用 astype() 強制轉換數據類型
創建自定義函數來轉換數據
使用 pandas 函數,例如 to_numeric() 或 to_datetime()
使用 astype() 函數
將 pandas 數據列轉換為不同類型的最簡單方法是使用 astype(),例如,要將 Customer Number 轉換為整數,我們可以這樣調用它:
df['Customer?Number'].astype('int')Output:
0 10002 1 552278 2 23477 3 24900 4 651029 Name: Customer Number, dtype: int32如果我們想更改原始數據中的信息,則需要定義變量接收返回值,因為 astype() 函數返回一個副本
df["Customer?Number"]?=?df['Customer?Number'].astype('int') df.dtypesOutput:
Customer Number int32 Customer Name object 2016 object 2017 object Percent Growth object Jan Units object Month int64 Day int64 Year int64 Active object dtype: object這樣我們就完成了 Customer Number 列的類型轉換
看起來很簡單,讓我們嘗試對 2016 列做同樣的事情,并將其轉換為浮點數:
同樣的,轉換 Jan Units 列
轉換異常了~
上面的情況中,數據中包含了無法轉換為數字的值。在 sales 列中,數據包括貨幣符號以及每個值中的逗號;在 Jan Units 列中,最后一個值是“Closed”,它不是數字
我們再來嘗試轉換 Active 列
df['Active'].astype('bool')Output:
0 True 1 True 2 True 3 True 4 True Name: Active, dtype: bool乍一看似乎還不錯,但仔細觀察,問題就大了。所有值都被解釋為 True,但最后一位客戶的 Active 標志為 N,竟然也被轉換為 True 了
所以,我們可以得到,astype() 的使用是有條件的,僅在以下情況下才有效:
數據是干凈的,可以簡單地轉換為一個數字
將數值轉換為字符串對象
如果數據有非數字字符或者不是同質的,那么 astype() 將不是類型轉換的好選擇。我們需要進行額外的轉換才能使類型更改正常工作
自定義轉換函數
由于此數據的轉換有點復雜,我們可以構建一個自定義函數,將其應用于每個值并轉換為適當的數據類型
對于(這個特定數據集的)貨幣轉換,我們可以使用一個簡單的函數:
def?convert_currency(val):"""Convert?the?string?number?value?to?a?float-?Remove?$-?Remove?commas-?Convert?to?float?type"""new_val?=?val.replace(',','').replace('$',?'')return?float(new_val)該代碼使用 python 的字符串函數去除“$”和“,”,然后將值轉換為浮點數
也許有人會建議使用 Decimal 類型的貨幣。但這不是 pandas 中的內置數據類型,所以我們使用 float 方法
現在我們可以使用 pandas 的 apply 函數將其應用于 2016 列中的所有值
df['2016'].apply(convert_currency)Output:
0 125000.0 1 920000.0 2 50000.0 3 350000.0 4 15000.0 Name: 2016, dtype: float64成功了!
當然我們也可以使用 lambda 函數來處理,代碼簡潔了,但是可讀性卻下降了
df['2016'].apply(lambda?x:?x.replace('$',?'').replace(',',?'')).astype('float')接下來處理 Active 列,自定義函數需要使用 np.where()。有幾種可能的方法可以解決這個特定問題。np.where() 方法對許多類型的問題都很有用,所以我們選擇在這里使用
基本思想是使用 np.where() 函數將所有“Y”值轉換為 True 并將其他所有值轉換為 False
df["Active"]?=?np.where(df["Active"]?==?"Y",?True,?False)Output:
數據類型也轉換為 bool 了
df.dtypesOutput:
Customer Number int32 Customer Name object 2016 object 2017 object Percent Growth object Jan Units object Month int64 Day int64 Year int64 Active bool dtype: objectPandas 輔助函數
Pandas 在 astype() 函數和更復雜的自定義函數之間有一個中間地帶,這些輔助函數對于某些數據類型轉換非常有用
到目前為止,我們沒有對日期列或 Jan Units 列做任何事情。這兩者都可以簡單地使用內置的 pandas 函數進行轉換,例如 pd.to_numeric() 和 pd.to_datetime()
Jan Units 轉換存在問題的原因是列中包含非數字值。如果我們嘗試使用 astype() 我們會得到一個錯誤(如前所述)。pd.to_numeric() 函數可以更優雅地處理這些值:
pd.to_numeric(df['Jan?Units'],?errors='coerce')Output:
0 500.0 1 700.0 2 125.0 3 75.0 4 NaN Name: Jan Units, dtype: float64有幾點需要注意。首先,該函數可以輕松處理數據并創建一個 float64 列。此外,它用 NaN 值替換了無效的“Closed”值,因為我們傳遞了 errors=coerce 。我們可以保留該值或使用 fillna(0) 將其填充為 0:
pd.to_numeric(df['Jan?Units'],?errors='coerce').fillna(0)Output:
0 500.0 1 700.0 2 125.0 3 75.0 4 0.0 Name: Jan Units, dtype: float64最后我們使用 pd.to_datetime() 函數來處理日期數據
pd.to_datetime(df[['Month',?'Day',?'Year']])Output:
0 2015-01-10 1 2014-06-15 2 2016-03-29 3 2015-10-27 4 2014-02-02 dtype: datetime64[ns]該函數將列組合成一系列適當的 datateime64 dtype,很方便
最后,我們把上面處理代碼都放到一起
df_2?=?pd.read_csv("sales_data_types.csv",dtype={'Customer?Number':?'int'},converters={'2016':?convert_currency,'2017':?convert_currency,'Percent?Growth':?convert_percent,'Jan?Units':?lambda?x:?pd.to_numeric(x,?errors='coerce'),'Active':?lambda?x:?np.where(x?==?"Y",?True,?False)})df_2.dtypesOutput:
Customer Number int32 Customer Name object 2016 float64 2017 float64 Percent Growth float64 Jan Units float64 Month int64 Day int64 Year int64 Active object dtype: object好了,這就是今天分享的全部內容,喜歡就點個贊+在看吧~
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】Pandas 数据类型概述与转换实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VUE中 ref $refs 使用详解
- 下一篇: websocket python爬虫_p