拯救pandas計劃(8)——當列聚合數(shù)與自身進行再次計算)
拯救pandas計劃(8)——當列聚合數(shù)與自身進行再次計算)
最近發(fā)現(xiàn)周圍的很多小伙伴們都不太樂意使用pandas,轉(zhuǎn)而投向其他的數(shù)據(jù)操作庫,身為一個數(shù)據(jù)工作者,基本上是張口pandas,閉口pandas了,故而寫下此系列以讓更多的小伙伴們愛上pandas。
系列文章說明:
系列名(系列文章序號)——此次系列文章具體解決的需求
平臺:
windows 10 python 3.8 pandas >=1.2.4
/ 數(shù)據(jù)需求
當列聚合數(shù)與自身進行再次計算,例如當列按照類別進行分組聚合后,使用這個單元格的數(shù)據(jù)使用四則運算或者其他計算方法對聚合結果進行再次計算。
/ 函數(shù)分享
本篇不解決任何需求,出門右轉(zhuǎn)有很多對應的解決方案,這里分享一則針對題目思考后的函數(shù),函數(shù)中有諸多紕漏,僅做拋磚引玉之用,大可拿去針對自我需求產(chǎn)出見解。
def?calculate_func(x,?args):
????"""
????平均值二次計算:使用四則運算選擇器, 通過args傳入的順序,
????對相應列使用對應方法,使當前列四則運算分類結果的平均值
????:params?x:?pd.DataFrame
????:params?args:?tuple,?計算列對應的操作方式
????return?返回所有列橫向合并后的pd.DataFrame對象
????example:
????df?=?pd.DataFrame([{'day':?'Fri',?'size':?4,?'total_bill':?40.17,?'tip':?4.73},
?????????????????{'day':?'Fri',?'size':?2,?'total_bill':?28.97,?'tip':?3.0},
?????????????????{'day':?'Fri',?'size':?2,?'total_bill':?27.28,?'tip':?4.0},
?????????????????{'day':?'Sat',?'size':?3,?'total_bill':?50.81,?'tip':?10.0},
?????????????????{'day':?'Sat',?'size':?4,?'total_bill':?48.33,?'tip':?9.0},
?????????????????{'day':?'Sat',?'size':?4,?'total_bill':?48.27,?'tip':?6.73},
?????????????????{'day':?'Sun',?'size':?6,?'total_bill':?48.17,?'tip':?5.0},
?????????????????{'day':?'Sun',?'size':?3,?'total_bill':?45.35,?'tip':?3.5},
?????????????????{'day':?'Sun',?'size':?2,?'total_bill':?40.55,?'tip':?3.0},
?????????????????{'day':?'Thur',?'size':?4,?'total_bill':?43.11,?'tip':?5.0},
?????????????????{'day':?'Thur',?'size':?5,?'total_bill':?41.19,?'tip':?5.0},
?????????????????{'day':?'Thur',?'size':?4,?'total_bill':?34.83,?'tip':?5.17}])
????result?=?df.groupby(['day'])[['size','total_bill',?'tip']].apply(func,?args=('sub',?'div',?'sub',?))
????>>>result
????????????????????size??total_bill???????tip
????day????????????????????????????????????
????Fri??0???1.333333????1.249844??0.820000
?????????1??-0.666667????0.901369?-0.910000
?????????2??-0.666667????0.848787??0.090000
????Sat??3??-0.666667????1.034055??1.423333
?????????4???0.333333????0.983583??0.423333
?????????5???0.333333????0.982362?-1.846667
????Sun??6???2.333333????1.077870??1.166667
?????????7??-0.666667????1.014768?-0.333333
?????????8??-1.666667????0.907362?-0.833333
????Thur?9??-0.333333????1.085621?-0.056667
?????????10??0.666667????1.037270?-0.056667
?????????11?-0.333333????0.877109??0.113333
????"""
????mean?=?x.mean()
????index?=?mean.index
????calculate_map?=?{'add':?x.add(mean),
?????????????????????'sub':?x.sub(mean),
?????????????????????'mul':?x.mul(mean),
?????????????????????'div':?x.div(mean)}
????return?pd.concat([calculate_map.get(i)[index[num]]?for?num,?i?in?enumerate(args)],?axis=1)
函數(shù)中使用了聚合函數(shù)mean作為聚合結果,可以聚合的列名作為mean后的index,通過args傳入的計算方式,提取calculate_map中對應方法,之后再查找args中各序號對應的columns(在mean結果中為index),結果為傳入的各個列名的pd.Series,再通過pd.concat(axis=1),橫向結合各個結果,返回pd.DataFrame對象。
(手動水?。涸瓌?chuàng)CSDN宿者朽命,https://blog.csdn.net/weixin_46281427?spm=1011.2124.3001.5343,公眾號A11Dot派)
/ 總結
本篇分享一個小小的函數(shù),功能實現(xiàn)如題,靈感來源于近日看見需求及部分代碼,很多代碼片段簡單,需求處理也不復雜的代碼,在常用代碼中卻沒有現(xiàn)成的,就需要自己構建新的函數(shù),其過程是需要一番思考及試錯的,在多番頭腦風暴后,撥開云霧見青天,是可用之用也。
你總覺得山上樹木叢生,路況復雜,蛇蟲布地,卻忘記了天空是藍色的,野花是鮮艷的。
于二零二二年三月十六日作
