Pandas:在没有行的情况下添加零值(稀疏)

时间:2016-12-28 21:41:20

标签: python pandas data-analysis

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

但是,DataFrame是稀疏。也就是说,如果没有与特定索引相对应的度量(例如(3,2)),那么它就不会任何(3,2)。我希望用p=0 and q=0填充这些行,使其不稀疏。继续这个例子,如果我df.loc[3].loc[2],我希望它返回p=0 q=0没有这样的记录(就像它目前那样)。

澄清:"稀疏",我的意思是它只是在我使用它的意义上,省略了零值。我没有提到熊猫或Numpy内部的任何内容。

1 个答案:

答案 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)