Создайте новый фрейм данных с помощью groupby и примените собственную функцию - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий фрейм данных.

df = pd.DataFrame({
    'id': [1, 2, 2, 2, 3, 3],
    'date': ['2020-01-01', '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-01', '2020-01-02'],
    'budget': [100, 150, 200, 250, 200, 200]})
   id   date    budget
0   1   2020-01-01  100
1   2   2020-01-01  150
2   2   2020-01-02  200
3   2   2020-01-03  250
4   3   2020-01-01  200
5   3   2020-01-02  200

Как эффективно преобразовать фрейм данных в новый фрейм со следующим выводом, если предположить, что сегодня это 2020-01-04?

    id  total_budget    budget_2_days_ago
0   1   100 NaN
1   2   600 200
2   3   400 200
def is_two_days_ago(date):
    return datetime.date.today() - datetime.timedelta(days=2) == date

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

1 Ответ

3 голосов
/ 28 февраля 2020

Один из способов сделать это. Функция не нужна.

from datetime import timedelta
a = '2020-01-04'
b = pd.to_datetime(a, format = '%Y-%m-%d')-timedelta(days=2)
consolidated = df.groupby('id')['budget'].sum().reset_index(name='total_budget')
days_ago = df.loc[pd.to_datetime(df['date'], format = '%Y-%m-%d')== b].groupby('id')['budget'].sum().reset_index(name='budget_2_days_ago')
consolidated.merge(days_ago, on='id', how='left')

вывод

    id  total_budget    budget_2_days_ago
0   1   100             NaN
1   2   600             200.0
2   3   400             200.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...