5 招學會 Pandas 數據類型轉化

大家好,我是才哥。

日常數據處理中,經常需要對一些數據進行類型轉化以便於後續的處理,由於自己不太喜歡記住它們,所以每次不記得具體函數方法的時候都是搜索一下,感覺還是有點 Fei 時間。

今天我們就整理一下常見的數據類型轉化操作,然後收藏起來以備不時之需吧!

目錄:

  1. 加載數據時指定數據類型

一般來說,爲了省事我都是直接pd.DataFrame(data)pd.read_xx(filename)就完事了。

比如:(下面數據大家直接拷貝後讀取剪切板即可

import pandas as pd

df = pd.read_excel('數據類型轉換案例數據.xlsx')
df

Qm39Bz

我們查看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

N6Sr4u

再查看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
  1. 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>
  1. pd.to_xx 轉化數據類型

pd.to_xx

3.1. pd.to_datetime 轉化爲時間類型

如果遇到無法轉換的情況,默認情況下會報錯,可以通過參數設置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)
  1. 智能判斷數據類型

convert_dtypes方法可以用來進行比較智能的數據類型轉化,請看

convert_dtypes

  1. 數據類型篩選

看到在一些學習羣經常有朋友問怎麼篩選指定數據類型的字段,今天我們也來介紹一下。

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.

數據類型有以下幾種:

數字:numberintfloat

布爾: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