我有一个ID表和季度数据日期,我想将其重新索引为每天(工作日)。
示例表:
我正在尝试找到一种pythonic或pandas方式来重新索引到较高频率的日期范围,例如每天并向前填充所有NaN。
到目前为止已经尝试过:
df = pd.read_sql('select date, id, type, value from db_table' con=conn, index_col=['date', 'id', 'type'])
dates = pd.bdate_range(start, end)
new_idx = pd.MultiIndex.from_product([dates, df.index.get_level_values(1), df.index.get_level_values(2)]
new_df = df.reindex(new_idx)
#this just hangs
new_df = new_df.groupby(level=1).fillna(method='ffill')
无济于事。我要么得到
Exception: cannot handle a non-unique multi-index!
或者,如果ID和类型之间的日期一致,则单个日期将被多次复制(听起来像个错误?)
最终,我只想按日期,ID和类型对表进行分组,并在ID和类型之间具有一致的日期索引。
有没有办法在大熊猫中做到这一点?
答案 0 :(得分:2)
是的,您可以使用merge
new_idx_frame=new_idx.to_frame()
new_idx_frame.columns=['date', 'id', 'type']
Yourdf=df.reset_index().merge(new_idx_frame,how='right',sort =True).groupby('id').ffill()# here I am using toy data
Out[408]:
id date type value
0 1 1 1 NaN
1 1 1 2 NaN
2 2 1 1 666666.0
3 2 1 2 99999.0
4 1 2 1 -1.0
5 1 2 1 -1.0
6 1 2 2 -1.0
7 2 2 1 99999.0
8 2 2 2 99999.0
样本数据
df=pd.DataFrame({'date':[1,1,2,2],'id':[2,2,1,1],'type':[2,1,1,1],'value':[99999,666666,-1,-1]})
df=df.set_index(['date', 'id', 'type'])
new_idx = pd.MultiIndex.from_product([[1,2], [1,2],[1,2]])
答案 1 :(得分:0)
温奔的答案差不多到了-谢谢你。唯一缺少的是进行前向填充时按['id','type']分组。
此外,在我的用例中创建新的多指标时,应该具有唯一的值:
new_idx = pd.MultiIndex.from_product([dates, df.index.get_level_values(1).unique(), df.index.get_level_values(2).unique()])