Применение операции к группировкам в пандах - PullRequest
0 голосов
/ 27 ноября 2018

РЕДАКТИРОВАТЬ : Я не специально изучаю, как выполнить эту конкретную операцию, мне нужно такое поведение для более сложной функции.Итак, ради вопроса, пожалуйста, сделайте вид, что функция берет группировку и возвращает фрейм данных, над которым была выполнена какая-то операция (но без суммирования).

Итак, скажем, у меня есть такой фрейм данных:

import pandas as pd

df = pd.DataFrame({
    "page": [
        1, 1, 1,
        2, 2, 2,
        3, 3, 3, 3
    ],
    "x": [
            10, 12, 21, 
            0, 5, 7, 
            1, 10, 33, 40
    ]
})

Я хочу вычислить различия каждого x на соответствующей странице.

То, как я это придумал, таково:

def compute_diff(group):
    return group.assign(
        diff = [
            *(group.x.values[1:] - group.x.values[0:len(group.x)-1]),
            None
        ]
    )

df.groupby('page').apply(compute_diff)

Теперь это работает нормально, но проблема в том, что я получаю фрейм данных с фреймами данных, то есть так:

        page    x   diff
page                
1   0   1   10  2.0
    1   1   12  9.0
    2   1   21  NaN
2   3   2   0   5.0
    4   2   5   2.0
    5   2   7   NaN
3   6   3   1   9.0
    7   3   10  23.0
    8   3   33  7.0
    9   3   40  NaN

Обратите внимание, что мои индексы немного испорчены, как я могу очистить это и получить формат, который выглядит примерно так:

    page    x   diff                
0   1   10  2.0
1   1   12  9.0
2   1   21  NaN
3   2   0   5.0
4   2   5   2.0
5   2   7   NaN
6   3   1   9.0
7   3   10  23.0
8   3   33  7.0
9   3   40  NaN

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Использование .iloc с diff

df['diff']=df.groupby('page').x.apply(lambda x : -x.iloc[::-1].diff()).sort_index(level=0).values
df
Out[106]: 
   page   x  diff
0     1  10   2.0
1     1  12   9.0
2     1  21   NaN
3     2   0   5.0
4     2   5   2.0
5     2   7   NaN
6     3   1   9.0
7     3  10  23.0
8     3  33   7.0
9     3  40   NaN
0 голосов
/ 27 ноября 2018

Как насчет использования GroupBy.diff вместо?

df.assign(diff=df.groupby('page').x.diff())

   page   x  diff
0     1  10   NaN
1     1  12   2.0
2     1  21   9.0
3     2   0   NaN
4     2   5   5.0
5     2   7   2.0
6     3   1   NaN
7     3  10   9.0
8     3  33  23.0
9     3  40   7.0

Если вы настаиваете на использовании apply, также используйте group_keys=False:

df.groupby('page', as_index=False, group_keys=False).apply(compute_diff)

   page   x  diff
0     1  10   2.0
1     1  12   9.0
2     1  21   NaN
3     2   0   5.0
4     2   5   2.0
5     2   7   NaN
6     3   1   9.0
7     3  10  23.0
8     3  33   7.0
9     3  40   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...