Элементарный Python AVERAGEIF эквивалентный Excel - PullRequest
0 голосов
/ 24 мая 2018

У меня есть 2darray, и для каждой строки я хочу вычислить average строки в столбце numbers для того же ключа (в данном случае key1 & key2. Вот простое представлениемоя проблема, и ниже то, что ожидать, чтобы иметь:

>>> df
Out[3]:
  key1 key2  number
0    a    c     100
1    b    d     200
2    a    a     150
3    a    a     200
>>> res
100
200
175 # (150+200)/2
175 # (150+200)/2

Я знаю, что есть методы агрегации, такие как grouby в pandas согласно предложениям, как в [1] и [2] , но метод groupby предоставит уникальные агрегаты, в то время как я собираюсь привести их к каждой строке.

Мой текущий рабочий процесс выглядит следующим образом:

  1. Получите агрегаты с помощью groupby('foo').mean()
  2. Затем для каждой строки сопоставьте строки key с агрегатами.

Например:

>>> K = df.key1 + df.key2

>>> K
Out[4]:
0    ac
1    bd
2    aa
3    aa
dtype: object

>>> agg = df2.groupby(K).mean()

>>> agg
Out[5]:
    number
aa     175
ac     100
bd     200

>>> avgif = []
... agg = agg.squeeze() # groupby results shape in (n, 1)
... for k in K:
...     avgif.append(agg.at[K])

>>> avgif
Out[6]:
[100, 200, 175, 175]

Это отлично работает, но моя настоящая проблема в том, что ряд может быть очень большим, может быть, до 200 тыс.

Поэтому я бы хотел, если бы кто-нибудь мог поделиться какими-либо предложениями. Спасибо!

1 Ответ

0 голосов
/ 24 мая 2018

Я думаю, нужно GroupBy.transform по обоим столбцам:

df['new'] = df.groupby(['key1','key2'])['number'].transform('mean')
print (df)
  key1 key2  number  new
0    a    c     100  100
1    b    d     200  200
2    a    a     150  175
3    a    a     200  175

Также работа изменила ваше решение, но предложите разделитель между _:

K = df.key1 + '_' + df.key2
df['new'] = df.groupby(K)['number'].transform('mean')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...