我有一个数据集(df2),其外观如下:
total_n
ind_n4 year city_code
9 2003 a 236
2004 a 520
54 2002 b 167
2004 b 997
2005 b 476
2006 b 742
数据集示例:
df = pd.DataFrame( {'year':[2003,2004,2002,2004,2005,2006],
'city_code':['a']*2+['b']*4,
'total_tax':pd.np.random.randint(100,1000,6)},
index=pd.Index(data=[9]*2+[54]*4,name='ind_n4'))
df1 = df.set_index('year',append=True)
df2 = df1.set_index('city_code',append=True)
我正在寻找的输出是一个看起来像这样的余额表:
total_n
ind_n4 city_code year
9 a 2002 0
2003 236
2004 520
2005 0
2006 0
b 2002 0
2003 0
2004 0
2005 0
2006 0
54 a 2002 0
2003 0
2004 0
2005 0
2006 0
b 2002 167
2003 0
2004 997
2005 476
2006 742
为此,我一直在使用这种方法,在Python Pandas: Balance an unbalanced dataset (for panel analysis)的一个相当相似的示例中提出了这种方法:
df_balanced = (df.set_index('year',append=True)
.reindex(pd.MultiIndex.from_product([df.index.unique(),
range(df.year.min(),df.year.max()+1)],
names=['id_inf','year']))
.reset_index(level=1))
但是,当我使用此代码时,出现了一条错误消息:NotImplementedError:未为MultiIndex定义isna
非常感谢您的帮助
答案 0 :(得分:2)
使用此:
df3 = df2.swaplevel(1,2)
df3.reindex(pd.MultiIndex.from_product(df3.index.levels), fill_value=0)\
.rename_axis(df3.index.names, axis=0)
输出:
total_tax
ind_n4 city_code year
9 a 2002 0
2003 317
2004 233
2005 0
2006 0
b 2002 0
2003 0
2004 0
2005 0
2006 0
54 a 2002 0
2003 0
2004 0
2005 0
2006 0
b 2002 956
2003 0
2004 609
2005 626
2006 811
详细信息: