Условное среднее с groupby - PullRequest
2 голосов
/ 30 мая 2020

Например, вот 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

То есть, группа df по year и key, а mean_except_current_key определяется как среднее от val по year, за исключением всех строк с тем же key, что и текущая строка.

Надеюсь Я прояснил эту проблему. Но я не могу понять этого. И я нашел этот вопрос . Однако он отличается от моего.

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 30 мая 2020

Не уверен, что есть лучший способ, но вот простая математика с использованием нескольких groupby и transform:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...