close
拯救pandas計劃(10)——對類別列分類計算數值列上下行差異值

最近發現周圍的很多小夥伴們都不太樂意使用pandas,轉而投向其他的數據操作庫,身為一個數據工作者,基本上是張口pandas,閉口pandas了,故而寫下此系列以讓更多的小夥伴們愛上pandas。

系列文章說明:

系列名(系列文章序號)——此次系列文章具體解決的需求

平台:

windows 10
python 3.8
pandas >=1.2.4
/ 數據需求

現有一組數據,包含類別列,日期列,以及其他需要進行差異值計算的數值列,如計算蘋果在2022-01-02賣出的數量比2022-01-01賣出的數量多了多少。

/ 需求拆解

需要對每個類型進行分組求值,那麼首先需要將各類型進行分類,然後再對各個類型進行求值就能夠完成需求。

/ 需求處理

使用for循環再對類型進行索引取值,再求出差異值這裡不做描述,在pandas里有個函數groupby可以很有效的將每個類型分隔開,返回時將所有結果進行聚合,非常適合該需求

方法一
#groupby.apply(lambdax:x.diff())#在聚合後的返回值是對類型,日期升序排序,所以在groupby之前先對data數據進行排序#這樣在返回值添加到data後就不會造成數據錯位data.sort_values(['類型','日期'],inplace=True)data[['進貨diff','賣出diff']]=data.groupby(['類型']).apply(lambdax:x[['進貨總量','賣出總量']].diff()).values

可以看到每個類型的首日和其他日期計算的結果是正確的。

方法二
#groupby.diff#對groupby後的結果直接進行索引要計算的列再調用diff方法data.sort_values(['類型','日期'],inplace=True)data[['進貨diff','賣出diff']]=data.groupby(['類型'])[['進貨總量','賣出總量']].diff()

得出的結果與方法一是一樣的。

方法三
#groupby.transform#返回與原始對象具有相同索引的數據幀#所以使用這種方法可以不用對原數據框進行排序再聚合data[['進貨diff','賣出diff']]=data.groupby(['類型']).transform(lambdax:x.diff())[['進貨總量','賣出總量']]
方法四

除上述簡單明了的方法之外,還寫了一個另類的求值方法。

importnumpyasnpimportpandasaspddefget_data_diff(data:pd.DataFrame,group_cols:list,val_cols:list,diff_cols:list,ascending:bool=True):"""自定義獲取數據框的diff:paramdata:pd.DataFrame類型:paramgroup_cols:list,需要聚合的列名:paramval_cols:list,需要排序的列名:paramdiff_cols:list,需要計算diff的列名:paramascending:排序方式,默認`True`,順序排序,接收bool或這個列表里全部為bool的列表:return:返回含diff的數據框"""#為了能返回傳入數據框的原index,將index保存至values中datac=data.reset_index().copy()index_colname=datac.columns[0]#對原數據框進行排序datac.sort_values(group_cols+val_cols,ascending=ascending,inplace=True)#求diffdatac[[f'{i}_diff'foriindiff_cols]]=datac[diff_cols].diff()#主要代碼:分組對組內進行編號rank0=np.hstack(datac.value_counts(group_cols,sort=False).map(lambdax:range(x)).values)#將每個類別的首個值用np.nan代替datac.loc[rank0==0,[f'{i}_diff'foriindiff_cols]]=np.nan#取出原index重置為index值datac.index=datac[index_colname].values#刪除額外生成的index值的列deldatac[index_colname]returndatacget_data_diff(df,['類型'],['日期'],['進貨總量','賣出總量'])

使用這個自擬的函數也可以達成目標。

(手動水印:原創CSDN宿者朽命,https://blog.csdn.net/weixin_46281427?spm=1011.2124.3001.5343,公眾號A11Dot派)

/ 總結

依賴pandas對行之間進行差異值計算(diff)也是非常方便的,如果需要分類計算只需要在diff前調用groupby方法就能完成需求,在之前的幾篇中有提到過groupby後面接apply,若apply調用的是自定義函數,如匿名函數,會使計算時間延長,為了能較快的得出結果,可儘量使用已定義好的方法。

久旱逢甘露,滴水當湧泉。

於二零二二年三月三十日作

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()