Как исключить одну строку из groupby().transform() в пандах? [дубликат]

avatar
Phil
8 апреля 2018 в 00:54
704
1
1

Моей целью было выполнить простой groupby, а затем сохранить средние значения группы в виде нового столбца, используя .transform('mean'). Потом все усложнилось. Загвоздка в том, что мне действительно нужно среднее значение n-1 значений, где n — количество строк, принадлежащих каждой группе. Пример данных, где столбец RESULT является моим желаемым результатом:

import pandas as pd

list_of_tuples = [('A', 3, 4.5),
                  ('A', 2, 4.75),
                  ('A', 5, 4),
                  ('A', 4, 4.25),
                  ('A', 7, 3.5),
                  ('B', 6, 6.75),
                  ('B', 9, 6),
                  ('B', 8, 6.25),
                  ('B', 4, 7.25),
                  ('B', 6, 6.75)]

df = pd.DataFrame.from_records(data=list_of_tuples, columns=['ID', 'VALUE', 'RESULT'])

>>> df
  ID  VALUE  RESULT
0  A      3    4.50
1  A      2    4.75
2  A      5    4.00
3  A      4    4.25
4  A      7    3.50
5  B      6    6.75
6  B      9    6.00
7  B      8    6.25
8  B      4    7.25
9  B      6    6.75

Вы можете видеть, что в первой строке значение RESULT является средним значением [2, 5, 4, 7], что равно 4,5. Аналогично, значение RESULT для последней строки является средним значением [6, 9, 8, 4], что равно 6,75.

Так что для каждого ряда значение Результат должен быть среднему групповой (группировка на <) ID ) в VALUE для этой конкретной строки.

Источник
Phil
8 апреля 2018 в 01:05
0

@IanThompson - Нет. Значение RESULT, где index = 3, должно исключать VALUE для этой строки (т.е. 4). Значение результатов, где индекс = 7, должно исключать 8.

Ответы (1)

avatar
Ian Thompson
8 апреля 2018 в 02:01
1

Получил ответ из моего комментария выше.

list_of_tuples = [('A', 3, 4.5),
                  ('A', 2, 4.75),
                  ('A', 5, 4),
                  ('A', 4, 4.25),
                  ('A', 7, 3.5),
                  ('B', 6, 6.75),
                  ('B', 9, 6),
                  ('B', 8, 6.25),
                  ('B', 4, 7.25),
                  ('B', 6, 6.75)]

df = pd.DataFrame(list_of_tuples)

df.drop(2, axis = 1, inplace = True)

n = df.groupby(0)[1].transform('count')
m = df.groupby(0)[1].transform('mean')
df['result'] = (m*n - df[1])/(n-1)

df

final