Pandas:在不存在行的地方添加零值(稀疏)

Pandas: Adding zero values where no rows exist (sparse)

我有一个带有 MultiIndex 的 Pandas DataFrame。 MultiIndex 的值在 (0,0)(1000,1000) 范围内,列有两个字段 pq.

但是,DataFrame 稀疏。也就是说,如果没有对应于特定索引的度量(例如 (3,2)),则不会有 any 行对应 (3,2)。我想通过用 p=0 and q=0 填充这些行来使其不稀疏。继续这个例子,如果我做 df.loc[3].loc[2],我希望它 return p=0 q=0 而不是 No Such Record(就像现在一样)。

澄清:"sparse",我的意思是仅在我使用它的意义上,零值被省略。我指的不是 Pandas 或 Numpy 内部的任何内容。

考虑这个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 与构造的 pd.MultiIndex.from_product

中的 fill_value=0 结合使用
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)