как скопировать средние значения groupby во всех применимых строках в Pandas - PullRequest
0 голосов
/ 03 июля 2018

Я слежу за этим примером и хочу воспроизвести с помощью панд. К сожалению, я почти сразу застрял: я не знаю, как добавить столбец со средними значениями для каждой категории для всех строк.

Мой фрейм данных:

ages = pd.DataFrame(
[[13, 0.0, 1.0, 1.0], 
[14, 0.0, 1.0, 0.0], 
[15, 0.0, 1.0, 0.0], 
[25, 1.0, 1.0, 1.0], 
[35, 0.0, 1.0, 1.0], 
[49, 1.0, 0.0, 0.0], 
[68, 1.0, 1.0, 1.0], 
[71, 1.0, 0.0, 0.0], 
[73, 1.0, 0.0, 1.0]], columns=['age', 'gardening', 'gameing', 'hats'])

Я хочу добавить столбец со средним возрастом для всех лиц, которые (не) занимаются садоводством:

ages['ma'] = ages.groupby('gardening')['age'].mean()

но это дает:

19.5
57.2
6 x NaN

и я хочу (первый столбец)

            gardening      age
19.5         0             13
19.5         0             14
19.5         0             15
57.2         1             25
19.5         0             35
57.2         1             49
57.2         1             68
57.2         1             71
57.2         1             73
 ^^

Я пробовал трансляцию, трансформацию, но это не дает желаемого результата. Как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Использование np.bincount и тот факт, что столбец gardening уже 0 и 1

def grp_mean(bins, weights):
    counts = np.bincount(bins)
    sums = np.bincount(bins, weights)
    return (sums / counts)[bins]

ages.assign(avg_garden_age=grp_mean(ages.gardening.values.astype(int), ages.age))

   age  gardening  gameing  hats  avg_garden_age
0   13        0.0      1.0   1.0           19.25
1   14        0.0      1.0   0.0           19.25
2   15        0.0      1.0   0.0           19.25
3   25        1.0      1.0   1.0           57.20
4   35        0.0      1.0   1.0           19.25
5   49        1.0      0.0   0.0           57.20
6   68        1.0      1.0   1.0           57.20
7   71        1.0      0.0   0.0           57.20
8   73        1.0      0.0   1.0           57.20
0 голосов
/ 03 июля 2018

Используйте groupby с transform:

ages['avg_garden_age'] = ages.groupby('gardening')['age'].transform('mean')
ages

Выход:

   age  gardening  gameing  hats  avg_garden_age
0   13        0.0      1.0   1.0           19.25
1   14        0.0      1.0   0.0           19.25
2   15        0.0      1.0   0.0           19.25
3   25        1.0      1.0   1.0           57.20
4   35        0.0      1.0   1.0           19.25
5   49        1.0      0.0   0.0           57.20
6   68        1.0      1.0   1.0           57.20
7   71        1.0      0.0   0.0           57.20
8   73        1.0      0.0   1.0           57.20
...