Pandas數(shù)據(jù)分析小技巧系列 第四集

三步加星標(biāo)
你好!我是 zhenguo
今天數(shù)據(jù)分析小技巧系列第 4 集,前三集在這里:
小技巧 12 dt 訪問器求時分(HH:mm)的分鐘差
構(gòu)造如下四行兩列的數(shù)據(jù),時間格式為:HH:MM

使用pandas讀入數(shù)據(jù):使用的 pandas 版本為 0.25.1
df?=?pd.read_excel('test_date_subtract.xlsx')
df
與時間相關(guān),自然第一感覺便是轉(zhuǎn)化為datetime格式,這里需要注意:需要首先將兩列轉(zhuǎn)化為 str 類型。
直接使用 astype 轉(zhuǎn)為 str 類型:
df['a']?=?df['a'].astype(str)
df['b']?=?df['b'].astype(str)
然后轉(zhuǎn)化為 datetime 類型:
df['atime']?=?pd.to_datetime(df['a'])
df['btime']?=?pd.to_datetime(df['b'])
df
然后使用 dt 訪問器轉(zhuǎn)化為分鐘數(shù):
df['amins']?=?df['atime'].dt.hour?*?60?+?df['atime'].dt.minute?
df['bmins']?=?df['btime'].dt.hour?*?60?+?df['btime'].dt.minute?
df
最后求分鐘數(shù)差值:
df['mins']?=?df['amins']?-?df['bmins']?
小技巧 13 轉(zhuǎn)為 DatetimeIndex 求時分(HH:mm)的分鐘差
轉(zhuǎn)化為 DatetimeIndex 類型后,直接獲取 hour 和 minute 屬性:
atime?=?pd.DatetimeIndex(df['a'])
btime?=?pd.DatetimeIndex(df['b'])
df['amins']?=?atime.hour?*?60?+?atime.minute
df['bmins']?=?btime.hour?*?60?+?btime.minute?
小技巧 14 split 求時分(HH:mm)的分鐘差
split 是更加高效的實現(xiàn),同樣需要先轉(zhuǎn)化為 str 類型:
df['a']?=?df['a'].astype(str)
df['b']?=?df['b'].astype(str)
其次 split:
df['asplit']?=?df['a'].str.split(':')
df['bsplit']?=?df['b'].str.split(':')
得到結(jié)果如下:

使用 apply 操作每個元素,轉(zhuǎn)化為分鐘數(shù):
df['amins']?=?df['asplit'].apply(lambda?x:?int(x[0])*60?+?int(x[1]))
df['bmins']?=?df['bsplit'].apply(lambda?x:?int(x[0])*60?+?int(x[1]))

小技巧15 100G 數(shù)據(jù)如何先隨機(jī)讀取1%?
對于動輒就幾十或幾百個 G 的數(shù)據(jù),在讀取的這么大數(shù)據(jù)的時候,我們有沒有辦法隨機(jī)選取一小部分?jǐn)?shù)據(jù),然后讀入內(nèi)存,快速了解數(shù)據(jù)和開展 EDA ?
使用 Pandas 的 skiprows 和 概率知識,就能做到。解釋具體怎么做,如下所示,讀取某 100 G 大小的 big_data.csv 數(shù)據(jù)
使用 skiprows 參數(shù), x > 0 確保首行讀入, np.random.rand() > 0.01 表示 99% 的數(shù)據(jù)都會被隨機(jī)過濾掉
言外之意,只有全部數(shù)據(jù) 1% 才有機(jī)會選入內(nèi)存中。
import?pandas?as?pd
import?numpy?as?np
??
df?=?pd.read_csv("big_data.csv",
skiprows?=
lambda?x:?x>0and?np.random.rand()?>?0.01)
??
print("The?shape?of?the?df?is?{}.
It?has?been?reduced?100?times!".format(df.shape))
使用這種方法,讀取的數(shù)據(jù)量迅速縮減到原來的 1% ,對于迅速展開數(shù)據(jù)分析有一定的幫助。
下面是我微信,任何問題都可留言:

