Сковываем групповуху и накладываем панд - PullRequest
0 голосов
/ 22 мая 2018

Я ищу способ объединить в группы и применить, как это (см. Код ниже для конкретного примера):

df.groupby("a").apply(func_1).groupby("b").apply(func_2)

Я думаю, это не сработает, потому что группа должна принятьвведите фрейм данных, что не всегда имеет место для 2-й группы выше (можно взять серию ввода, см. пример).Решением может быть использование первого применения, которое выводит результат func_1 плюс исходный фрейм данных, но я не нашел, как это сделать.

Я ищу общий обходной путь, а не просто обходной путь для этого конкретного примера.

Пример. Допустим, я хочу вычислить область под бордюром a для каждой группы в b, а затем вычислить сумму этих областей для каждой группы в c.

df=pd.DataFrame({"a":np.arange(8),"b":np.repeat(np.arange(4),2),
"c":np.repeat(np.arange(2),4)})

df
   a  b  c
0  0  0  0
1  1  0  0
2  2  1  0
3  3  1  0
4  4  2  1
5  5  2  1
6  6  3  1
7  7  3  1


df.groupby("b").apply(lambda x: trapz(x["a"])).groupby("c").apply(sum)   
Traceback (most recent call last):
[...]
KeyError: 'c'


#Expected output
c
0     3.0
1    11.0


#I know that this code works, but I would like to avoid to modify 
#my dataframe :

df["result"]=list(df
    .groupby("b").apply(lambda x: trapz(x["a"]))
    .repeat(df.groupby("b").size()))
df.groupby("b").first().groupby("c").result.sum()

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

1 Ответ

0 голосов
/ 22 мая 2018

Я думаю, я бы сделал что-то вроде:

# your_fun is the function you want to apply
df.groupby('c').apply(lambda f: sum(f.groupby('b')['a'].apply(your_fun))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...