Как рассчитать разницу по сгруппированным df? - PullRequest
0 голосов
/ 30 января 2019
name      date      value
 a      1/1/2011      3
 b      1/1/2011      5
 c      1/1/2011      7
 a      1/2/2011      6
 b      1/2/2011      10
 c      1/2/2011      14

У меня есть df здесь, где значение кумулятивной статистики.Таким образом, фактическое значение name: a date: 1/2/2011 равно 3, а не 6. Чтобы получить фактическое значение определенного дня, мне нужно взять значение этого дня минус значение предыдущего дня.Я хочу рассчитать фактическое значение каждого имени для каждой даты.Что-то вроде df.groupby(['name', 'date'])['value'].diff(), но этот код возвращает ошибку.

В конце концов мне нужно

name      date   actual value
 a      1/1/2011      3
 b      1/1/2011      5
 c      1/1/2011      7
 a      1/2/2011      3
 b      1/2/2011      5
 c      1/2/2011      7

Ответы [ 2 ]

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

Это можно сделать одной строкой и векторизованным способом.

import pandas as pd

df = pd.read_clipboard() # Reading from your question

df['value'] = df.groupby('name')['value'].diff(1).fillna(df['value'])

Как обсуждалось в комментариях, необходимо ссылаться на исходную серию 'values при применении fillna кправильно заменить значения NaN на diff (это происходит для первого экземпляра каждой метки в 'name').

0 голосов
/ 30 января 2019
df['value'] = df['value'].fillna(method='ffill')
df = df.sort_values(by=['name', 'date'])
df['actual'] = df.groupby(['name'])['value'].transform(lambda x: x.diff())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...