書接上回,對獲取的數據去空去重和選擇之後,我們得到了要比較乾淨的數據,但這只是完成了第一步,在進一步計算和分析之前,還需要確定數據是否是我們想要的數據類型:
比如,如果要進行數據列之間的加減乘除計算,需要數據列都是數值型(整數或小數),如果要對日期列進行篩選和計算,需要數據是日期和時間類型(2021-12-31)。
總而言之,數據就是要分門別類,整整齊齊,我們才能絲滑處理!
那麼pandas 自帶的數據類型都有哪些呢?先來看一下:
可以看出,pandas支持的數據類型很多樣,基本涵蓋了我們的需要。我們來實際應用一下。
獲取數據
老規矩,首先使用pd.read_excel()讀取數據,賦給數據框df:
import pandas as pddf = pd.read_excel('sale_data.xlsx')df.head()
df.head()列印前5行,可以看到只有「客戶編號」和「購買數量」是純數字型的(int 表示整數),涉及到金額的幾列數據都帶有符號(¥、%),肯定無法直接進行運算。
我們使用df.info()方法查看數據概況:發現有8列數據類型是object, 即文本型數據,無法直接進行計算。
接下來一起看看常用的數據類型轉換的方法。
首先看看最常用的.astype(),這個方法可以直接將某列數據轉換為另一種類型,在括號內輸入文本型的'int' 或'float', 即可轉為整數型和浮點數型(小數型):
df['購買數量'] = df['購買數量'].astype('int')df['購買數量'] = df['購買數量'].astype('float')
接下來,使用函數的方法處理一下帶有貨幣符號和百分比符號的數據。
這裡有兩種方法,分別是自定義函數和匿名函數lambda:
自定義函數
def currency_converter(x): new_x = x.replace('¥','') return float(new_x) lis = ['購買單價','總金額','2020年總金額','2019年總金額']for i in lis: df[i] = df[i].apply(currency_converter) 使用更簡單的匿名函數方式,即不需要自行定義,配合apply 方法使用,一行代碼實現同樣的效果:lis = ['購買單價','總金額','2020年總金額','2019年總金額']for i in lis: df[i] = df[i].apply(lambda x : x.replace('¥','')).astype('float') 同樣的lambda方法,可以對「活躍用戶」一列用數字0和1替換,1代表活躍用戶:df['活躍客戶'] = df['活躍客戶'].apply(lambda x : 1 if x=='是' else 0)最後來看一下,使用pandas的.to_datetime()方法把「購買日期」轉為日期類型 ,以及 .to_numeric()把方法「購買數量」轉為數值型:df['購買日期'] = pd.to_datetime(df['購買日期'])df['購買數量'] = pd.to_numeric(df['購買數量'])a. 使用.dt方法將年月日拆分為三列:
df['購買日期-年'] = df['購買日期'].dt.year df['購買日期-月'] = df['購買日期'].dt.monthdf['購買日期-日'] = df['購買日期'].dt.daydf[df['購買日期'].dt.month == 2]當讀取的數據列中的數據不是我們想要的類型時,可以對列使用以下方法轉換,縱享絲滑!.astype() 直接轉換數據類型
.apply()和lambda配合使用,一行代碼實現轉換
.to_datetime() 轉換為日期時間類型,方便進行時間相關計算。
公眾號後臺回覆:轉換,獲取源數據和代碼,說一千道一萬,不如自己來一遍!
喜悅玩python,Happy coding!