我在数据帧上进行groupby和resample操作后创建了Panas系列对象。
我想填写最小和最大日期之间的缺失天数,每个item_type的数量为零。
data = {'date_time': ['2018-01-22 12:40:03', '2018-01-22 13:40:03', '2018-01-23 15:00:05', '2018-01-26 14:30:04'],
'quantity': [11, 21, 23, 12], 'item_type': ['543', '543', '842', '543']}
df = pd.DataFrame(data, columns = ['date_time', 'quantity' , 'item_type'])
df.index = df['date_time']
df.index = pd.to_datetime(df.index)
min_date = df.index.min()
max_date = df.index.max()
grouped = df.groupby('item_type').resample('D')['quantity'].sum()
print(grouped)
>> Message: item_type date_time
543 2018-01-22 32.0
2018-01-23 NaN
2018-01-24 NaN
2018-01-25 NaN
2018-01-26 12.0
842 2018-01-23 23.0
Name: quantity, dtype: float64
如果我白天不进行重新采样,我可以获得一个可以迭代的groupby对象,然后从每个组创建一个数据框并获得总数,但总数不是当天:
grouped = df.groupby('item_type')
for item_type, group in grouped:
df = group.groupby(['date_time']).sum()
如何获得每天每种商品类型的总数量,并根据下面所需的输出数量值为零,错过天数?
item_type date_time quantity
543 2018-01-22 32.0
2018-01-23 0
2018-01-24 0
2018-01-25 0
2018-01-26 12.0
842 2018-01-22 0
2018-01-23 23.0
2018-01-24 0
2018-01-25 0
2018-01-26 0
答案 0 :(得分:2)
我不确定在 groupby期间执行会有多容易,但您确定可以在分组后执行此操作。使用pd.date_range
然后reindex
创建日期范围。
g = df.groupby('item_type').resample('D')['quantity'].sum()
dates = pd.date_range(
g.index.levels[0].min(), g.index.levels[0].max()
)
idx = pd.MultiIndex.from_product([g.index.levels[0], dates])
g.reindex(idx, fill_value=0)
543 2018-01-22 32
2018-01-23 0
2018-01-24 0
2018-01-25 0
2018-01-26 12
842 2018-01-22 0
2018-01-23 23
2018-01-24 0
2018-01-25 0
2018-01-26 0
Name: quantity, dtype: int64