亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 .mean() 應用于具有條件的分組數據

將 .mean() 應用于具有條件的分組數據

拉風的咖菲貓 2024-01-24 20:43:26
我有一個df看起來像這樣的:Day         Country         Type        Product         Cost        Mon         US              1           a1              0Mon         US              2           a1              5Mon         US              3           a1              6Mon         CA              1           a1              8Mon         CA              2           a1              0Mon         CA              3           a1              1我正在努力做到這一點:Day         Country         Type        Product         Cost        AverageMon         US              1           a1              0           (5+6)/2Mon         US              2           a1              5           (5+6)/2Mon         US              3           a1              6           (5+6)/2Mon         CA              1           a1              8           (8+1)/2Mon         CA              2           a1              0           (8+1)/2Mon         CA              3           a1              1           (8+1)/2這個想法是將其按Country和進行分組Product,并獲得平均成本,但取其所在Costs的位置>0。我嘗試過的:np.where(df['Cost']>0, df.loc[df.groupby(['Country','Product'])]['Cost'].mean())但我得到:ValueError:無法使用多維鍵進行索引將內置函數(例如.mean(), max(), etc帶有過濾器的分組熊貓數據框)應用的最佳實踐解決方案是什么?
查看完整描述

2 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

第一個想法是替換0NaNs 然后使用GroupBy.transformwith?mean,默認情況下省略缺失值:

print (df.assign(new = df['Cost'].where(df['Cost'] > 0)))

? ?Day Country? Type Product? Cost? new

0? Mon? ? ? US? ? ?1? ? ? a1? ? ?0? NaN

1? Mon? ? ? US? ? ?2? ? ? a1? ? ?5? 5.0

2? Mon? ? ? US? ? ?3? ? ? a1? ? ?6? 6.0

3? Mon? ? ? CA? ? ?1? ? ? a1? ? ?8? 8.0

4? Mon? ? ? CA? ? ?2? ? ? a1? ? ?0? NaN

5? Mon? ? ? CA? ? ?3? ? ? a1? ? ?1? 1.0



df['Average'] = (df.assign(new = df['Cost'].where(df['Cost'] > 0))

? ? ? ? ? ? ? ? ? ?.groupby(['Country','Product'])['new']

? ? ? ? ? ? ? ? ? ?.transform('mean'))

print (df)

? ?Day Country? Type Product? Cost? Average

0? Mon? ? ? US? ? ?1? ? ? a1? ? ?0? ? ? 5.5

1? Mon? ? ? US? ? ?2? ? ? a1? ? ?5? ? ? 5.5

2? Mon? ? ? US? ? ?3? ? ? a1? ? ?6? ? ? 5.5

3? Mon? ? ? CA? ? ?1? ? ? a1? ? ?8? ? ? 4.5

4? Mon? ? ? CA? ? ?2? ? ? a1? ? ?0? ? ? 4.5

5? Mon? ? ? CA? ? ?3? ? ? a1? ? ?1? ? ? 4.5

或者首先過濾、聚合mean并按以下方式分配回來DataFrame.join:


s = df[df["Cost"] > 0].groupby(['Country','Product'])['Cost'].mean().rename('Average')

df = df.join(s, on=['Country','Product'])

print (df)

? ?Day Country? Type Product? Cost? Average

0? Mon? ? ? US? ? ?1? ? ? a1? ? ?0? ? ? 5.5

1? Mon? ? ? US? ? ?2? ? ? a1? ? ?5? ? ? 5.5

2? Mon? ? ? US? ? ?3? ? ? a1? ? ?6? ? ? 5.5

3? Mon? ? ? CA? ? ?1? ? ? a1? ? ?8? ? ? 4.5

4? Mon? ? ? CA? ? ?2? ? ? a1? ? ?0? ? ? 4.5

5? Mon? ? ? CA? ? ?3? ? ? a1? ? ?1? ? ? 4.5


查看完整回答
反對 回復 2024-01-24
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

嘗試這個 :

df[df["Cost"] > 0].groupby(['Country','Product'])["Cost"].mean()

它過濾掉成本大于零的地方,對其進行分組,然后取平均值。


查看完整回答
反對 回復 2024-01-24
  • 2 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號