【问题标题】:Conditional mean with groupbygroupby 条件均值
【发布时间】:2023-03-24 22:25:01
【问题描述】:

例如,这里是一个DataFrame:

df = pd.DataFrame({'year': ['2019', '2019', '2019', '2019', '2020', '2020', '2020'],
                   'key': ['a', 'a', 'b', 'c', 'd', 'e', 'f'],
                   'val': [3, 4, 3, 5, 6, 1, 2]})

看起来像

    year    key val
0   2019    a   3
1   2019    a   4
2   2019    b   3
3   2019    c   5
4   2020    d   6
5   2020    e   1
6   2020    f   2

我想要得到的是

year  key    mean_except_current_key
2019  a      4
      b      4
      c      3.33
2020  d      1.5
      e      4
      f      3.5

也就是说,将dfyearkey 分组,mean_except_current_key 定义为valyear 的平均值,除了与当前行具有相同key 的所有行。

我希望我已经把这个问题说清楚了。但我想不通。我找到了this question。不过和我的不一样。

感谢您的帮助。

【问题讨论】:

  • 您能否通过一个简单的例子详细说明如何计算mean_except_current_key。只需说明您如何获得 2019 年的 4 和密钥 a
  • @Ch3steR 它是 2019 年 val 和 2019 年关键 b(即 3)和 val 以及关键 c(即 5)的平均值。
  • 是的,明白了。明白了。

标签: python pandas pandas-groupby


【解决方案1】:

不确定是否有更好的方法,但这里有一些使用多个 groupbytransform 的简单数学:

x = df.groupby("year")["val"].transform(sum)- df.groupby(["year","key"])["val"].transform(sum)
y = df.groupby("year")["key"].transform("count").sub(df.groupby(["year","key"])["val"].transform("count"))
df["new"] = x/y
print (df)

   year key  val       new
0  2019   a    3  4.000000
1  2019   a    4  4.000000
2  2019   b    3  4.000000
3  2019   c    5  3.333333
4  2020   d    6  1.500000
5  2020   e    1  4.000000
6  2020   f    2  3.500000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 2020-07-07
    • 2021-10-18
    • 1970-01-01
    • 2021-10-20
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多