Кумулятивный дифференциал от групп - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно рассчитать разницу от начала уровня MultiIndex, чтобы рассчитать затухание от начала уровня. Мой пример ввода и вывода будет выглядеть примерно так:

               values
place time     
A     a           120
      b           100
      c            90
      d            50
B     e            11
      f            12
      g            10
      h             9

               values

A     a           NaN
      b           -20
      c           -30
      d           -70
B     e           Nan
      f            +1
      g            -1
      h            -2

Я могу использовать grouby, чтобы получить разницу между последовательными ячейками на уровне:

df.groupby(level=0)['values'].diff()

Но это не совсем то, что я хочу!

Увы, принятый ответ не совсем то, что я хочу. У меня есть лучший пример:

arrays = [np.array(['bar', 'bar', 'bar', 'foo', 'foo', 'foo']),
          np.array(['one', 'two', 'three', 'one', 'two', 'three'])]
df = pd.DataFrame([1000, 800, 500, 800, 400, 200], index=arrays)

   bar one    1000
       two     800
       three   500
   foo one     800
       two     400
       three   200

    expected_result = pd.DataFrame([Nan, -200, -500, Nan, -400, -600], index=arrays)

   bar one      Nan
       two     -200
       three   -500
   foo one     Nan 
       two     -400
       three   -600

Но результат df.groupby(level=0).diff().cumsum() дает:

pd.DataFrame([Nan, -200, -500, Nan, -900, -1100], index=arrays)

   bar one      Nan
       two     -200
       three   -500
   foo one      Nan 
       two     -900
       three   -1100

Ответы [ 2 ]

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

Вы можете получить то, что я хотел, цепочкой другого groupby:

arrays = [np.array(['bar', 'bar', 'bar', 'foo', 'foo', 'foo']),
      np.array(['one', 'two', 'three', 'one', 'two', 'three'])]
df = pd.DataFrame([1000, 800, 500, 800, 400, 200], index=arrays)

   bar one    1000
       two     800
       three   500
   foo one     800
       two     400
       three   200

    expected_result = pd.DataFrame([Nan, -200, -500, Nan, -400, -600], index=arrays)

df.groupby(level=0).diff().groupby(level=0).cumsum()

    bar one      Nan
       two     -200
       three   -500
    foo one     Nan 
       two     -400
       three   -600
0 голосов
/ 02 мая 2018

Вы ищете cumsum после?

df.groupby(level=0)['values'].diff().cumsum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...