为了账号安全,请及时绑定邮箱和手机立即绑定

将 .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 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信