5招學(xué)會(huì)Pandas數(shù)據(jù)類型轉(zhuǎn)化
今天我們就整理一下常見的數(shù)據(jù)類型轉(zhuǎn)化操作,然后收藏起來以備不時(shí)之需吧!
目錄:
1. 加載數(shù)據(jù)時(shí)指定數(shù)據(jù)類型
2. astype轉(zhuǎn)換數(shù)據(jù)類型
3. pd.to_xx轉(zhuǎn)化數(shù)據(jù)類型
3.1. pd.to_datetime轉(zhuǎn)化為時(shí)間類型
3.2. pd.to_numeric轉(zhuǎn)化為數(shù)字類型
3.3. pd.to_timedelta轉(zhuǎn)化為時(shí)間差類型
4. 智能判斷數(shù)據(jù)類型
5. 數(shù)據(jù)類型篩選

1. 加載數(shù)據(jù)時(shí)指定數(shù)據(jù)類型
一般來說,為了省事我都是直接pd.DataFrame(data)或pd.read_xx(filename)就完事了。
比如:(下面數(shù)據(jù)大家直接拷貝后讀取剪切板即可)
import pandas as pd
df = pd.read_excel('數(shù)據(jù)類型轉(zhuǎn)換案例數(shù)據(jù).xlsx')
df
| 國家 | 受歡迎度 | 評(píng)分 | 向往度 | |
|---|---|---|---|---|
| 0 | 中國 | 10 | 10 | 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 |
我們查看dtypes屬性
df.dtypes
國家 object
受歡迎度 int64
評(píng)分 float64
向往度 float64
dtype: object
可以看到國家字段是object類型,受歡迎度是int整數(shù)類型,評(píng)分與向往度都是float浮點(diǎn)數(shù)類型。而實(shí)際上,對(duì)于向往度我們可能需要的是int整數(shù)類型,國家字段是string字符串類型。
那么,我們可以在加載數(shù)據(jù)的時(shí)候通過參數(shù)dtype指定各字段數(shù)據(jù)類型。
import pandas as pd
df = pd.read_excel('數(shù)據(jù)類型轉(zhuǎn)換案例數(shù)據(jù).xlsx',
dtype={
'國家':'string',
'向往度':'Int64'
}
)
df
| 國家 | 受歡迎度 | 評(píng)分 | 向往度 | |
|---|---|---|---|---|
| 0 | 中國 | 10 | 10 | 10 |
| 1 | 美國 | 6 | 5.8 | 7 |
| 2 | 日本 | 2 | 1.2 | 7 |
| 3 | 德國 | 8 | 6.8 | 6 |
| 4 | 英國 | 7 | 6.6 | <nan> |
再查看dtypes屬性
df.dtypes
國家 string
受歡迎度 int64
評(píng)分 float64
向往度 Int64
dtype: object
同樣,在創(chuàng)建DataFrame類型數(shù)據(jù)時(shí)也可以通過dtype參數(shù)進(jìn)行數(shù)據(jù)類型設(shè)定(案例是對(duì)全部字段進(jìn)行設(shè)置)。
df = pd.DataFrame({'A':[1,2,3,4.],
'B':[1,3,5,7]
},
dtype='float32'
)
df.dtypes
A float32
B float32
dtype: object

2. astype轉(zhuǎn)換數(shù)據(jù)類型
對(duì)于已經(jīng)存在的數(shù)據(jù),我們常用astype來轉(zhuǎn)換數(shù)據(jù)類型,可以對(duì)某列(Series)也可以同時(shí)指定多列。
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]:
國家 受歡迎度 評(píng)分 向往度
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>
3. pd.to_xx轉(zhuǎn)化數(shù)據(jù)類型

3.1. pd.to_datetime轉(zhuǎn)化為時(shí)間類型
日期like的字符串轉(zhuǎn)換為日期 時(shí)間戳轉(zhuǎn)換為日期等 數(shù)字字符串按照format轉(zhuǎn)換為日期
如果遇到無法轉(zhuǎn)換的情況,默認(rèn)情況下會(huì)報(bào)錯(cuò),可以通過參數(shù)設(shè)置errors='coerce'將無法轉(zhuǎn)換的設(shè)置為NaT。
# 將字符串轉(zhuǎn)化為日期
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]
# 還可以將時(shí)間戳轉(zhuǎn)化為日期
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]
# 數(shù)字字符串按照format轉(zhuǎn)換為日期
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]
需要注意的是,對(duì)于上述時(shí)間戳的日期轉(zhuǎn)化,起始時(shí)間默認(rèn)是1970-01-01,對(duì)于國內(nèi)時(shí)間來說會(huì)相差8小時(shí),我們有以下幾種方式處理。
In [13]: s
Out[13]:
0 1490195805
1 1590195805
2 1690195805
dtype: int64
# 默認(rèn)情況下 格林威治時(shí)間
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]
# 將起始時(shí)間加上 8小時(shí)
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]
# 手動(dòng) 加上 8小時(shí)
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轉(zhuǎn)化為數(shù)字類型
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轉(zhuǎn)化為時(shí)間差類型
將數(shù)字、時(shí)間差字符串like等轉(zhuǎn)化為時(shí)間差數(shù)據(jù)類型
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)
4. 智能判斷數(shù)據(jù)類型
convert_dtypes方法可以用來進(jìn)行比較智能的數(shù)據(jù)類型轉(zhuǎn)化,請(qǐng)看


5. 數(shù)據(jù)類型篩選
看到在一些學(xué)習(xí)群經(jīng)常有朋友問怎么篩選指定數(shù)據(jù)類型的字段,今天我們也來介紹一下。
Pandas提供了一個(gè)按照字段數(shù)據(jù)類型篩選的函數(shù)select_dtypes(),通過參數(shù)可以選定需要的數(shù)據(jù)類型字段和排除的數(shù)據(jù)類型字段。
Signature:
df.select_dtypes(include=None, exclude=None) -> 'DataFrame'
Docstring:
Return a subset of the DataFrame's columns based on the column dtypes.
數(shù)據(jù)類型有以下幾種:
數(shù)字:
number或int、float布爾:
bool時(shí)間:
datetime64時(shí)間差:
timedelta64類別:
category字符串:
string對(duì)象:
object
In [27]: df
Out[27]:
國家 受歡迎度 評(píng)分 向往度
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
評(píng)分 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]:
受歡迎度 評(píng)分 向往度
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]:
受歡迎度 評(píng)分 向往度
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
以上就是本次全部內(nèi)容,希望對(duì)你有幫助,喜歡的話記得點(diǎn)個(gè)贊,刷個(gè)在看哦!
其實(shí),還有更多參數(shù)方法大家可以通過help或者?來看一看演示一下!





