Pandas: вычислить среднее значение, исключив значение собственной строки - PullRequest
1 голос
/ 16 апреля 2019

Я хочу рассчитать средние значения по группам, оставив значение самой строки.

import pandas as pd

d = {'col1': ["a", "a", "b", "a", "b", "a"], 'col2': [0, 4, 3, -5, 3, 4]}
df = pd.DataFrame(data=d)

Я знаю, как вернуть средства по группе:

df.groupby('col1').agg({'col2': 'mean'})

Что возвращает:

Out[247]: 
  col1  col2
1    a     4
3    a    -5
5    a     4

Но то, что я хочу, это иметь в виду под группой, исключая значение строки. Например. для первого ряда:

df.query('col1 == "a"')[1:4].mean()

, который возвращает:

Out[251]: 
col2    1.0
dtype: float64

Edit: Ожидаемый результат - это кадр данных того же формата, что и df выше, со столбцом mean_excl_own, который является средним значением для всех остальных членов группы, исключая собственное значение строки.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Вы можете GroupBy col1 и transform со средним значением.Затем вычтите значение из данной строки из среднего значения:

df['col2'] = df.groupby('col1').col2.transform('mean').sub(df.col2)
0 голосов
/ 17 апреля 2019

Спасибо за ваш вклад. В итоге я использовал подход, связанный с @ VnC.

Вот как я это решил:

import pandas as pd

d = {'col1': ["a", "a", "b", "a", "b", "a"], 'col2': [0, 4, 3, -5, 3, 4]}
df = pd.DataFrame(data=d)

group_summary = df.groupby('col1', as_index=False)['col2'].agg(['mean', 'count'])
df = pd.merge(df, group_summary, on = 'col1')

df['other_sum'] = df['col2'] * df['mean'] - df['col2'] 
df['result'] = df['other_sum'] / (df['count']  - 1)

Проверьте окончательный результат:

df['result']

Какие отпечатки:

Out: 
0    1.000000
1   -0.333333
2    2.666667
3   -0.333333
4    3.000000
5    3.000000
Name: result, dtype: float64

Редактировать: Ранее у меня были некоторые проблемы с именами столбцов, но я исправил это, используя этот ответ.

...