Pandas groupby.diff () не возвращает ожидаемый результат - PullRequest
0 голосов
/ 19 января 2019

У меня есть внешняя группа и внутренняя группа, и я хочу найти разницу внутри каждой внутренней группы в зависимости от внешней группы. Обычно я могу вкладывать внутреннюю группу в каждую внешнюю группу, используя groupby, но по какой-то причине функция diff для groupby возвращает плоский вектор вместо вложенного массива.

df = pd.DataFrame({'inner':list('aabbccddee'),'outer':[0,0,1,1,0,0,1,1,0,0],
    'value':np.random.randint(0,100,10)})

    inner  outer  value
0     a      0     78
1     a      0     68
2     b      1     78
3     b      1     22
4     c      0     53
5     c      0     25
6     d      1     82
7     d      1     38
8     e      0      2
9     e      0     39

Если я желаю, например, sum для внутренней группы для каждой внешней группы, я просто использую groupby:

In [19]: df.groupby(['outer','inner']).sum()
Out[19]:
             value
outer inner
0     a        146
      c         78
      e         41
1     b        100
      d        120

Выше приведен правильный вывод, и он работает для всех других функций , за исключением diff. Когда я использую diff, я хочу вывод в формате, аналогичном приведенному выше, но вместо этого я получаю:

In [20]: df.groupby(['outer','inner']).diff()
Out[20]:
   value
0    NaN
1  -10.0
2    NaN
3  -56.0
4    NaN
5  -28.0
6    NaN
7  -44.0
8    NaN
9   37.0

Вышеуказанное эквивалентно df.groupby(['inner']).value.diff(), поэтому, похоже, groupby не учитывает внешнюю группу. Я не могу найти тренировки для этого, но использование groupby было бы более элегантным и лаконичным. Кто-нибудь знает, почему это происходит и как это можно исправить?

1 Ответ

0 голосов
/ 19 января 2019

Такие функции, как s.diff(), cumsum и т. Д., Не являются функцией агрегирования, поэтому вы можете получить результат в форме ряда, вы можете использовать np.diff() здесь, пример ниже:

print(df.groupby(['outer','inner'])['value'].apply(lambda x: np.diff(x).item()))

outer  inner
0      a       -10
       c       -28
       e        37
1      b       -56
       d       -44
...