У меня есть набор данных, для которого я хотел бы выполнить несколько шагов агрегации, используя. Этот код создает данные:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B'],
'S': [200, 100, 300, 400],
'Date': pd.to_datetime(['2019-01-01', '2019-01-01', '2019-02-01', '2019-03-01']).date,
'Value': [5, 10, 30, 40]})
выход:
df1:
Name S Date Value
0 A 200 2019-01-01 5
1 A 100 2019-01-01 10
2 B 300 2019-02-01 30
3 B 400 2019-03-01 40
Конечный результат агрегации должен выглядеть следующим образом:
2019-01-01 2019-02-01 2019-03-01
A 100, 200 15
B 300 - 400 30 40
Первый шаг Idid is
df2 = df.groupby(by=['Name', 'Date']).agg({'S': lambda x: ', '
.join(pd.DataFrame([str(s) for s in x]).drop_duplicates()
.sort_values(by=0)
.iloc[:, 0]
.map(str)),
'Value': np.sum,})
Часть .join(...)
немного запутана, но принимает числа в S
, отбрасывает дубликаты, сортирует и объединяет их в строку.
В результате получаетсяэто:
df2:
S Value
Name Date
A 2019-01-01 100, 200 15
B 2019-02-01 300 30
2019-03-01 400 40
и вот я застрял. Я могу сгенерировать следующее:
df3 = (df2.pivot_table('Value', index=['Name', 'S'], columns=['Date'],
aggfunc={'Value': np.sum})
.fillna(0)
.reset_index()
)
df3:
Date Name S 2019-01-01 2019-02-01 2019-03-01
0 A 100, 200 15.0 0.0 0.0
1 B 300 0.0 30.0 0.0
2 B 400 0.0 0.0 40.0
Однако я бы хотел, чтобы две последние строки были объединены, с S
, становящимся 300 - 400
(аналогично соединению для df2
). Я не выяснил, как я могу объединить эти агрегаты в один шаг (смешивая groupby
и pivot_table
).
Спасибо за помощь.