我有一个带有MultiIndex的Pandas DataFrame。 MultiIndex的值范围为(0,0)
到(1000,1000)
,该列有两个字段p
和q
。
但是,DataFrame是稀疏。也就是说,如果没有与特定索引相对应的度量(例如(3,2)
),那么它就不会任何行(3,2)
。我希望用p=0 and q=0
填充这些行,使其不稀疏。继续这个例子,如果我df.loc[3].loc[2]
,我希望它返回p=0 q=0
,不没有这样的记录(就像它目前那样)。
澄清:"稀疏",我的意思是它只是在我使用它的意义上,省略了零值。我没有提到熊猫或Numpy内部的任何内容。
答案 0 :(得分:3)
考虑这个df
data = {
(1, 0): dict(p=1, q=1),
(3, 2): dict(p=1, q=1),
(5, 4): dict(p=1, q=1),
(7, 6): dict(p=1, q=1),
}
df = pd.DataFrame(data).T
df
p q
1 0 1 1
3 2 1 1
5 4 1 1
7 6 1 1
将reindex
与构建的fill_value=0
pd.MultiIndex.from_product
一起使用
mux = pd.MultiIndex.from_product([range(8), range(8)])
df.reindex(mux, fill_value=0)
p q
0 0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
7 0 0
1 0 1 1
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
7 0 0
2 0 0 0
1 0 0
2 0 0
3 0 0
对评论的回应
您可以获得像这样的最小,最大索引级别
def mn_mx(idx):
return idx.min(), idx.max()
mn0, mx0 = mn_mx(df.index.levels[0])
mn1, mx1 = mn_mx(df.index.levels[1])
mux = pd.MultiIndex.from_product([range(mn0, mx0 + 1), range(mn1, mx1 + 1)])
df.reindex(mux, fill_value=0)