Сгруппировать и найти среднее значение столбца по ряду, подмножества этого ряда - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема с питоном.Это мои данные выборки

     col1  col2  desired
0    a     1     2.50
1    a     2     2.00
2    a     3     1.50
3    b     2     3.00
4    b     3     2.00
5    c     3     1.67
6    c     1     2.33
7    c     2     2.00
8    c     2     2.00

, входные данные df['col1'] и df['col2'].Я хочу использовать эти два столбца для получения желаемого результата в df['desired'].

Идея состоит в том, что я хочу сгруппировать по col1 и вычислить среднее значение col2.Единственный трюк здесь заключается в том, что я хочу исключить текущую строку из расчета среднего значения.

Так что для строки 0 я группирую по df['col1'] == 'a', но для вычисления используем только строки 1 и 2среднее.Для строки 1 я также группирую по df['col1'] == 'a', но я использую только строки 1 и 3. И так далее.

Единственное, о чем я могу думать, - это создать пользовательскую функцию для .transform(), которая будет принимать в качестве входных данных серию, поступающую от сгруппированного объекта, но я не уверен, как к ней подойти.В идеале я ищу более простой (панда?) Метод для достижения этой цели.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Другой вариант - фильтрация выбранной строки:

df['desired'] = df.apply(lambda x: df[~df.index.isin([x.name])].groupby('col1')['col2'].mean().loc[x['col1']], axis=1)

вывод:

>>0    2.5
1    2.0
2    1.5
3    5.5
4    5.0
5    4.5
0 голосов
/ 18 декабря 2018

Решение, работающее с определением mean - sum/count.

Итак, сначала рассчитаем на transform и вычтем 1 для удаления фактической строки, то же самое с sum дляудалить фактическое значение строки.Последнее деление и присвоение новому столбцу:

a = df.groupby('col1')['col2'].transform('size').sub(1)
b = df.groupby('col1')['col2'].transform('sum').sub(df['col2'])

df['des'] = b / a
print (df)
  col1  col2  desired       des
0    a     1     2.50  2.500000
1    a     2     2.00  2.000000
2    a     3     1.50  1.500000
3    b     2     3.00  3.000000
4    b     3     2.00  2.000000
5    c     3     1.67  1.666667
6    c     1     2.33  2.333333
7    c     2     2.00  2.000000
8    c     2     2.00  2.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...