之前已经问过这个问题,这里已经提出了一个可行的解决方案Pandas 在 Groupby 中重新索引日期 https://stackoverflow.com/questions/32275540/pandas-reindex-dates-in-groupby,这过去对我有用,但现在不再有用了。
因此,回顾一下,我需要使用日期重新索引数据帧以创建“平衡面板” - 不要在任何组中缺少日期值组合。这是一个例子:
import pandas as pd
from datetime import datetime
date1 = datetime.strptime('2023-01-01', '%Y-%m-%d').date()
date2 = datetime.strptime('2023-01-02', '%Y-%m-%d').date()
date3 = datetime.strptime('2023-01-03', '%Y-%m-%d').date()
df = pd.DataFrame({'Date':[date1] * 3 + [date2] + [date3] * 3,
'Group':['A', 'B', 'C', 'A', 'A', 'B', 'C'],
'Value':[20, 10, 23, 45, 60, 14, 25]})
df.set_index('Date', inplace=True)
期望的输出是:
df_target = pd.DataFrame({'Date':[date1] * 3 + [date2] * 3 + [date3] * 3,
'Group':['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'Value':[20, 10, 23, 45, 0, 0, 60, 14, 25]})
df_target.set_index('Date', inplace=True)
尝试的解决方案(注意断言):
def reindex_by_date(df, freq):
dates = pd.date_range(start=df.index.min(), end=df.index.max(), freq=freq)
idx = pd.Index(dates, name='Dates')
assert dates.duplicated().sum()==0
return df.reindex(dates, fill_value=0)
df.groupby('Group').apply(reindex_by_date(df, freq='D'))
# this has also been added: .reset_index(drop=True)
产生错误:
ValueError: cannot reindex from a duplicate axis
我什至检查了标志(这里是True
):
df.flags.allows_duplicate_labels