利用Python实现数据偏移
總第190篇/張俊紅
現(xiàn)在有如下這么一張表,這張表存儲(chǔ)了每個(gè)uid在不同周(w)的訂單情況。我們想知道每個(gè)用戶在不同周內(nèi)消費(fèi)頻次的變化情況。消費(fèi)頻次變化的標(biāo)準(zhǔn)就是這周訂單數(shù)和上周訂單數(shù)的相對變化,如果這周訂單比上周增加了,就說明消費(fèi)頻次提高了,反之則說明消費(fèi)頻次降低了。
要實(shí)現(xiàn)上面的需求,其實(shí)只需要新增一列,這一列用來存儲(chǔ)每個(gè)uid在上一周期的訂單情況,然后將兩列進(jìn)行做差,差的結(jié)果就是每個(gè)uid消費(fèi)頻次的變化。具體結(jié)果如下:
上面這個(gè)結(jié)果該如何實(shí)現(xiàn)呢?也就是如何讓數(shù)據(jù)進(jìn)行上下偏移呢?借助的就是Python中的shift函數(shù),我們這一節(jié)就講講shift是怎么使用的。shift的功能是對數(shù)據(jù)進(jìn)行偏移,該函數(shù)的具體參數(shù)如下:
df.shift(periods=1,?freq=None,?axis=0)periods為偏移的幅度;freq只適用于時(shí)間索引的偏移,是對索引的偏移,而值不發(fā)生變化;axis用來指明是橫向偏移還是縱向偏移,當(dāng)axis=0時(shí)表示縱向偏移,默認(rèn)就是縱向偏移,當(dāng)要縱向偏移時(shí),axis參數(shù)可以省略不寫。當(dāng)axis=1時(shí)表示橫向偏移。如果periods為正,則表示向下/右偏移,如果peeriods為負(fù),則表示向上/左偏移。接下來我們看一些具體實(shí)例:
df.shift(1)運(yùn)行上面的代碼,所有的數(shù)據(jù)向下偏移一行,具體結(jié)果如下:
df.shift(-1)運(yùn)行上面的代碼,所有的數(shù)據(jù)向上偏移一行,具體結(jié)果如下:
df.shift(1,axis?=?1)運(yùn)行上面的代碼,所有的數(shù)據(jù)向右偏移一列,具體結(jié)果如下:
df.shift(-1,axis?=?1)運(yùn)行上面的代碼,所有的數(shù)據(jù)向左偏移一列,具體結(jié)果如下:
了解完了shift用法以后我們來看下我們開頭那個(gè)需求該怎么做呢?新增加一列l(wèi)ast_sales,并給其賦值為sales列,然后將last_sales這一列向上偏移一行。實(shí)現(xiàn)代碼如下:
df["last_sales"]?=?df["sales"] df["last_sales"]?=?df["last_sales"].shift(1) df運(yùn)行上面代碼,會(huì)得到每一行的sales_s與他的上一行的sales,這個(gè)sales不一定是他自己上一個(gè)周期的sales,比如第一個(gè)uid=2的上一個(gè)周期應(yīng)該是0,但是這里面卻是4:
很明顯,上面的結(jié)果并非我們想要的結(jié)果,我們想要的是每個(gè)uid內(nèi)的上一個(gè)周期的sales,而非每一行sales對應(yīng)的上一行的sales,那怎么辦呢?方法就是在組內(nèi)進(jìn)行shift,也就是與groupby 進(jìn)行組合使用,先對uid進(jìn)行g(shù)roupby,然后再進(jìn)行shift偏移,具體代碼如下:
df["last_sales"]?=?df.groupby("uid")["sales"].shift(1).fillna(0) df最后運(yùn)行上面的代碼,就得到了我們開頭想要的結(jié)果,即每個(gè)uid當(dāng)期的sales和他自己上一期的sales,具體結(jié)果如下:
以上就是關(guān)于shift函數(shù)的使用情況。
你還可以看:
最近瘋傳的SIR傳染病模型是什么?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的利用Python实现数据偏移的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妖狐第九层怎么过
- 下一篇: 打开rar文件的软件有哪些?(上有什么值