Python學習筆記:Pandas數據類型轉化


一、Pandas讀取剪切板數據

import pandas as pd
df = pd.read_clipboard()
'''
	國家	受歡迎度	評分	向往度
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
'''
df.dtypes
'''
國家       object
受歡迎度      int64
評分      float64
向往度     float64
dtype: object
'''
  • object 類型
  • int 整數類型
  • float 浮點數類型
  • string 字符串類型

二、加載數據時指定數據類型

最簡單的加載數據: pd.DataFrame(data)pd.read_csv(file_name)

# 讀取數據時指定
import pandas as pd
df = pd.read_csv('data.csv',
                dtype={
                    'a':'string',
                    'b':'int64'
                })

# 創建 DataFrame 類型數據時通過 dtype 參數設定
df = pd.DataFrame({
    'a':[1,2,3],
    'b':[4,5,6]
},
dtype='float32'
)   
df  
'''
a	b
0	1.0	4.0
1	2.0	5.0
2	3.0	6.0
'''

三、astype轉換數據類型

df.受歡迎度.astype('float')

df.astype({'國家':'string',
          '向往度':'Int64'})

四、pd.to_xx 轉換數據類型

  • to_datetime
  • to_numeric
  • to_pickle
  • to_timedelta

4.1 pd.to_datetime 轉換為時間類型

  • 轉換為日期
  • 轉換為時間戳
  • 按照 format 轉換為日期
pd.to_datetime(date['date'], format="%m%d%Y")

針對日期列混合多種日期類型,可考慮:

# 添加日期長度輔助列
df['col'] = df['date'].apply(len)
df_new = df.loc[df['col'] > 10]
df_new['col2'] = pd.to_datetime(df_new['date'], format="%m%d%Y")

另外兩種方式均可實現:

# 轉換時遇到不能轉換的數據轉化為 NaN
df['date_new'] = pd.to_datetime(df['date'], format="%m%d%Y", errors='coerce')
# 嘗試轉換為日期類型
df['date_new'] = pd.to_datetime(df['date'], infer_datetime_format=True)

實例:

# 轉換日期
ss = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
pd.to_datetime(ss, format="%m/%d/%Y")
pd.to_datetime(ss, infer_datetime_format=True) # 自動識別

# 轉換時間戳
aa = pd.Series([1490195805, 1590195805, 1690195805])
pd.to_datetime(aa, unit='s')
bb = pd.Series([1490195805433502912, 1590195805433502912, 1690195805433502912])
pd.to_datetime(bb, unit='ns')

# 轉換字符串
cc = pd.Series(['20200101', '20200202', '202003'])
pd.to_datetime(cc, format='%Y%m%d', errors='ignore') # 不轉換
pd.to_datetime(cc, format='%Y%m%d', errors='coerce') # 錯誤置為 NaT

需要注意的是,對於上述時間戳的日期轉化,起始時間默認是1970-01-01對於國內時間來說會相差8小時, 可以手動加上。

print(pd.to_datetime(aa, unit='s'))
print(pd.to_datetime(aa, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00'))) # 指定起始時間
print(pd.to_datetime(aa, unit='s') + pd.Timedelta(days=8/24)) # 手動加上8小時
'''
0   2017-03-22 15:16:45
1   2020-05-23 01:03:25
2   2023-07-24 10:50:05
dtype: datetime64[ns]
0   2017-03-22 23:16:45
1   2020-05-23 09:03:25
2   2023-07-24 18:50:05
dtype: datetime64[ns]
0   2017-03-22 23:16:45
1   2020-05-23 09:03:25
2   2023-07-24 18:50:05
dtype: datetime64[ns]
'''

4.2 pd.to_numeric 轉換為數字類型

# 語法
pd.to_numeric(data, errors='raise', downcast=None)
  • errors:默認'raise',處理錯誤的方式,可選{‘ignore’, ‘raise’, ‘coerce’};
    • ‘ignore’:無效的轉換將返回輸入;
    • ‘raise’:無效的轉換將引發異常;
    • ‘coerce’:無效的轉換將設為NaN;
  • downcast:默認None,可選{‘integer’, ‘signed’, ‘unsigned’, ‘float’};如果不是None,並且數據已成功轉換為數字數據類型,則根據一定規則將結果數據向下轉換為可能的最小數字數據類型;‘integer’ 或 ‘signed’: 最小的有符號整型(numpy.int8);‘unsigned’: 最小的無符號整型(numpy.uint8);‘float’: 最小的浮點型(numpy.float32);
data = pd.Series(['1.0','2',-100])
print(data)
print(pd.to_numeric(data))
print(pd.to_numeric(data, downcast='signed'))

data2 = pd.Series(['apple', '1.0', '2', -100])
print(pd.to_numeric(data2, errors='ignore')) # 不轉換
print(pd.to_numeric(data2, errors='coerce')) # 錯誤以NaN替換

4.3 pd.to_timedelta 轉換為時間差類型

將數字、時間差字符串like等轉化為時間差數據類型。

import numpy as np
print(pd.to_timedelta(np.arange(5), unit='d'))
# TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)

print(pd.to_timedelta('1 days 06:06:01.00003'))
# 1 days 06:06:01.000030

pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
# TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)

五、智能判斷數據類型

convert_dtypes 方法可以用來進行比較智能的數據類型轉換。

print(df.dtypes)
'''
國家            object
受歡迎度           int64
評分           float64
向往度          float64
over_long      int64
dtype: object
'''
dfn = df.convert_dtypes()
print(dfn.dtypes)
'''
國家            string
受歡迎度           Int64
評分           Float64
向往度            Int64
over_long      Int64
dtype: object
'''

六、數據類型篩選

select_dtypes() 實現按照字段數據類型篩選。

df.select_dtypes(include=None, exclude=None) -> 'DataFrame'
  • 數字:number、int、float
  • 布爾:bool
  • 時間:datetime64
  • 時間差:timedelta64
  • 類別:category
  • 字符串:string
  • 對象:object
df.select_dtypes(include='float')
df.select_dtypes(include='number')
df.select_dtypes(include=['int','object'])
df.select_dtypes(exclude='object')

參考鏈接:5招學會Pandas數據類型轉化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM