2 回答

TA貢獻1847條經驗 獲得超7個贊
第一個想法是替換0
為NaN
s 然后使用GroupBy.transform
with?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

TA貢獻1828條經驗 獲得超4個贊
嘗試這個 :
df[df["Cost"] > 0].groupby(['Country','Product'])["Cost"].mean()
它過濾掉成本大于零的地方,對其進行分組,然后取平均值。
添加回答
舉報