5 招學會 Pandas 數據類型轉化
大家好,我是才哥。
日常數據處理中,經常需要對一些數據進行類型轉化以便於後續的處理,由於自己不太喜歡記住它們,所以每次不記得具體函數方法的時候都是搜索一下,感覺還是有點 Fei 時間。
今天我們就整理一下常見的數據類型轉化操作,然後收藏起來以備不時之需吧!
目錄:
-
- 加載數據時指定數據類型
-
- astype 轉換數據類型
-
- pd.to_xx 轉化數據類型
-
3.1. pd.to_datetime 轉化爲時間類型
-
3.2. pd.to_numeric 轉化爲數字類型
-
3.3. pd.to_timedelta 轉化爲時間差類型
-
- 智能判斷數據類型
-
- 數據類型篩選
- 加載數據時指定數據類型
一般來說,爲了省事我都是直接pd.DataFrame(data)
或pd.read_xx(filename)
就完事了。
比如:(下面數據大家直接拷貝後讀取剪切板即可)
import pandas as pd
df = pd.read_excel('數據類型轉換案例數據.xlsx')
df
我們查看dtypes
屬性
df.dtypes
國家 object
受歡迎度 int64
評分 float64
嚮往度 float64
dtype: object
可以看到國家字段是object
類型,受歡迎度是int
整數類型,評分與嚮往度都是float
浮點數類型。而實際上,對於嚮往度我們可能需要的是int
整數類型,國家字段是string
字符串類型。
那麼,我們可以在加載數據的時候通過參數dtype
指定各字段數據類型。
import pandas as pd
df = pd.read_excel('數據類型轉換案例數據.xlsx',
dtype={
'國家':'string',
'嚮往度':'Int64'
}
)
df
再查看dtypes
屬性
df.dtypes
國家 string
受歡迎度 int64
評分 float64
嚮往度 Int64
dtype: object
同樣,在創建 DataFrame 類型數據時也可以通過 dtype 參數進行數據類型設定(案例是對全部字段進行設置)。
df = pd.DataFrame({'A':[1,2,3,4.],
'B':[1,3,5,7]
},
dtype='float32'
)
df.dtypes
A float32
B float32
dtype: object
- astype 轉換數據類型
對於已經存在的數據,我們常用astype
來轉換數據類型,可以對某列(Series
)也可以同時指定多列。
In [1]: df.受歡迎度.astype('float')
Out[1]:
0 10.0
1 6.0
2 2.0
3 8.0
4 7.0
Name: 受歡迎度, dtype: float64
In [2]: df.astype({'國家':'string',
'嚮往度':'Int64'})
Out[2]:
國家 受歡迎度 評分 嚮往度
0 中國 10 10.0 10
1 美國 6 5.8 7
2 日本 2 1.2 7
3 德國 8 6.8 6
4 英國 7 6.6 <NA>
- pd.to_xx 轉化數據類型
pd.to_xx
3.1. pd.to_datetime 轉化爲時間類型
-
日期 like 的字符串轉換爲日期
-
時間戳轉換爲日期等
-
數字字符串按照 format 轉換爲日期
如果遇到無法轉換的情況,默認情況下會報錯,可以通過參數設置errors='coerce'
將無法轉換的設置爲NaT
。
# 將字符串轉化爲日期
In [3]: s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
In [4]: s
Out[4]:
0 3/11/2000
1 3/12/2000
2 3/13/2000
dtype: object
In [5]: pd.to_datetime(s, infer_datetime_format=True)
Out[5]:
0 2000-03-11
1 2000-03-12
2 2000-03-13
dtype: datetime64[ns]
# 還可以將時間戳轉化爲日期
In [6]: s = pd.Series([1490195805, 1590195805, 1690195805])
In [7]: pd.to_datetime(s, unit='s')
Out[7]:
0 2017-03-22 15:16:45
1 2020-05-23 01:03:25
2 2023-07-24 10:50:05
dtype: datetime64[ns]
In [8]: s = pd.Series([1490195805433502912, 1590195805433502912, 1690195805433502912])
In [9]: pd.to_datetime(s, unit='ns')
Out[9]:
0 2017-03-22 15:16:45.433502912
1 2020-05-23 01:03:25.433502912
2 2023-07-24 10:50:05.433502912
dtype: datetime64[ns]
# 數字字符串按照format轉換爲日期
In [10]: s = pd.Series(['20200101', '20200202', '202003'])
In [11]: pd.to_datetime(s, format='%Y%m%d', errors='ignore')
Out[11]:
0 20200101
1 20200202
2 202003
dtype: object
In [12]: pd.to_datetime(s, format='%Y%m%d', errors='coerce')
Out[12]:
0 2020-01-01
1 2020-02-02
2 NaT
dtype: datetime64[ns]
需要注意的是,對於上述時間戳的日期轉化,起始時間默認是1970-01-01
,對於國內時間來說會相差 8 小時,我們有以下幾種方式處理。
In [13]: s
Out[13]:
0 1490195805
1 1590195805
2 1690195805
dtype: int64
# 默認情況下 格林威治時間
In [14]: pd.to_datetime(s, unit='s')
Out[14]:
0 2017-03-22 15:16:45
1 2020-05-23 01:03:25
2 2023-07-24 10:50:05
dtype: datetime64[ns]
# 將起始時間加上 8小時
In [15]: pd.to_datetime(s, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00'))
Out[15]:
0 2017-03-22 23:16:45
1 2020-05-23 09:03:25
2 2023-07-24 18:50:05
dtype: datetime64[ns]
# 手動 加上 8小時
In [16]: pd.to_datetime(s, unit='s') + pd.Timedelta(days=8/24)
Out[16]:
0 2017-03-22 23:16:45
1 2020-05-23 09:03:25
2 2023-07-24 18:50:05
dtype: datetime64[ns]
3.2. pd.to_numeric 轉化爲數字類型
In [17]: s = pd.Series(['1.0', '2', -3])
In [18]: pd.to_numeric(s)
Out[18]:
0 1.0
1 2.0
2 -3.0
dtype: float64
In [19]: pd.to_numeric(s, downcast='signed')
Out[19]:
0 1
1 2
2 -3
dtype: int8
In [20]: s = pd.Series(['apple', '1.0', '2', -3])
In [21]: pd.to_numeric(s, errors='ignore')
Out[21]:
0 apple
1 1.0
2 2
3 -3
dtype: object
In [22]: pd.to_numeric(s, errors='coerce')
Out[22]:
0 NaN
1 1.0
2 2.0
3 -3.0
dtype: float64
3.3. pd.to_timedelta 轉化爲時間差類型
將數字、時間差字符串 like 等轉化爲時間差數據類型
In [23]: import numpy as np
In [24]: pd.to_timedelta(np.arange(5), unit='d')
Out[24]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
In [25]: pd.to_timedelta('1 days 06:05:01.00003')
Out[25]: Timedelta('1 days 06:05:01.000030')
In [26]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
Out[26]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)
- 智能判斷數據類型
convert_dtypes
方法可以用來進行比較智能的數據類型轉化,請看
convert_dtypes
- 數據類型篩選
看到在一些學習羣經常有朋友問怎麼篩選指定數據類型的字段,今天我們也來介紹一下。
Pandas
提供了一個按照字段數據類型篩選的函數select_dtypes()
,通過參數可以選定需要的數據類型字段和排除的數據類型字段。
Signature:
df.select_dtypes(include=None, exclude=None) -> 'DataFrame'
Docstring:
Return a subset of the DataFrame's columns based on the column dtypes.
數據類型有以下幾種:
數字:
number
或int
、float
布爾:
bool
時間:
datetime64
時間差:
timedelta64
類別:
category
字符串:
string
對象:
object
In [27]: df
Out[27]:
國家 受歡迎度 評分 嚮往度
0 中國 10 10.0 10.0
1 美國 6 5.8 7.0
2 日本 2 1.2 7.0
3 德國 8 6.8 6.0
4 英國 7 6.6 NaN
In [28]: df.dtypes
Out[28]:
國家 object
受歡迎度 int64
評分 float64
嚮往度 float64
dtype: object
In [29]: df.select_dtypes(include='int')
Out[29]:
受歡迎度
0 10
1 6
2 2
3 8
4 7
In [30]: df.select_dtypes(include='number')
Out[30]:
受歡迎度 評分 嚮往度
0 10 10.0 10.0
1 6 5.8 7.0
2 2 1.2 7.0
3 8 6.8 6.0
4 7 6.6 NaN
In [31]: df.select_dtypes(include=['int','object'])
Out[31]:
國家 受歡迎度
0 中國 10
1 美國 6
2 日本 2
3 德國 8
4 英國 7
In [32]: df.select_dtypes(exclude=['object'])
Out[32]:
受歡迎度 評分 嚮往度
0 10 10.0 10.0
1 6 5.8 7.0
2 2 1.2 7.0
3 8 6.8 6.0
4 7 6.6 NaN
以上就是本次全部內容,希望對你有幫助,喜歡的話記得點個贊,刷個在看哦!
其實,還有更多參數方法大家可以通過help
或者?
來看一看演示一下!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/p2MAdXcX3Y_mKM1p94aq1Q