Трансляция группового результата в виде нового столбца в исходном кадре данных - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать новый столбец в кадре данных Pandas на основе двух столбцов в сгруппированном кадре данных.

В частности, я пытаюсь повторить вывод этого кода R:

library(data.table)

df = data.table(a = 1:6, 
            b = 7:12,
            c = c('q', 'q', 'q', 'q', 'w', 'w')
            )


df[, ab_weighted := sum(a)/sum(b), by = "c"]
df[, c('c', 'a', 'b', 'ab_weighted')]

Вывод:

enter image description here

До сих пор я пробовал в Python следующее:

import pandas as pd

df = pd.DataFrame({'a':[1,2,3,4,5,6],
               'b':[7,8,9,10,11,12],
               'c':['q', 'q', 'q', 'q', 'w', 'w']
              })

df.groupby(['c'])['a', 'b'].apply(lambda x: sum(x['a'])/sum(x['b']))

Вывод:

enter image description here

Когда я изменяю apply в приведенном выше коде transform Я получаю сообщение об ошибке: TypeError: требуется целое число

Преобразование работает нормально, хотя я использую только один столбец:

import pandas as pd

df = pd.DataFrame({'a':[1,2,3,4,5,6],
               'b':[7,8,9,10,11,12],
               'c':['q', 'q', 'q', 'q', 'w', 'w']
              })

 df.groupby(['c'])['a', 'b'].transform(lambda x: sum(x))

Но, очевидно,, это не тот ответ:

enter image description here

Есть ли способ получить результат из моего кода data.table в Pandas без необходимости создавать промежуточныйстолбцы (потому что тогда я мог бы использовать transform в последнем столбце?

Любая помощь с благодарностью:)

Ответы [ 2 ]

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

Простое исправление кода с использованием map, R и pandas по-прежнему отличается, что означает, что не каждая функция R, которую вы можете найти заменой в pandas

df.c.map(df.groupby(['c'])['a', 'b'].apply(lambda x: sum(x['a'])/sum(x['b'])))
Out[67]: 
0    0.294118
1    0.294118
2    0.294118
3    0.294118
4    0.478261
5    0.478261
Name: c, dtype: float64
0 голосов
/ 12 декабря 2018

Ты в шаге от тебя.

v = df.groupby('c')[['a', 'b']].transform('sum')
df['ab_weighted'] = v.a / v.b

df
   a   b  c  ab_weighted
0  1   7  q     0.294118
1  2   8  q     0.294118
2  3   9  q     0.294118
3  4  10  q     0.294118
4  5  11  w     0.478261
5  6  12  w     0.478261
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...