猿问

将 .mean() 应用于具有条件的分组数据

我有一个df看起来像这样的:


Day         Country         Type        Product         Cost        


Mon         US              1           a1              0

Mon         US              2           a1              5

Mon         US              3           a1              6

Mon         CA              1           a1              8

Mon         CA              2           a1              0

Mon         CA              3           a1              1

我正在努力做到这一点:


Day         Country         Type        Product         Cost        Average


Mon         US              1           a1              0           (5+6)/2

Mon         US              2           a1              5           (5+6)/2

Mon         US              3           a1              6           (5+6)/2

Mon         CA              1           a1              8           (8+1)/2

Mon         CA              2           a1              0           (8+1)/2

Mon         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带有过滤器的分组熊猫数据框)应用的最佳实践解决方案是什么?


拉风的咖菲猫
浏览 158回答 2
2回答

aluckdog

第一个想法是替换0为NaNs 然后使用GroupBy.transformwith mean,默认情况下省略缺失值:print (df.assign(new = df['Cost'].where(df['Cost'] > 0)))   Day Country  Type Product  Cost  new0  Mon      US     1      a1     0  NaN1  Mon      US     2      a1     5  5.02  Mon      US     3      a1     6  6.03  Mon      CA     1      a1     8  8.04  Mon      CA     2      a1     0  NaN5  Mon      CA     3      a1     1  1.0df['Average'] = (df.assign(new = df['Cost'].where(df['Cost'] > 0))                   .groupby(['Country','Product'])['new']                   .transform('mean'))print (df)   Day Country  Type Product  Cost  Average0  Mon      US     1      a1     0      5.51  Mon      US     2      a1     5      5.52  Mon      US     3      a1     6      5.53  Mon      CA     1      a1     8      4.54  Mon      CA     2      a1     0      4.55  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  Average0  Mon      US     1      a1     0      5.51  Mon      US     2      a1     5      5.52  Mon      US     3      a1     6      5.53  Mon      CA     1      a1     8      4.54  Mon      CA     2      a1     0      4.55  Mon      CA     3      a1     1      4.5

明月笑刀无情

尝试这个 :df[df["Cost"] > 0].groupby(['Country','Product'])["Cost"].mean()它过滤掉成本大于零的地方,对其进行分组,然后取平均值。
随时随地看视频慕课网APP

相关分类

Python
我要回答