Pandas:在不存在行的地方添加零值(稀疏)
Pandas: Adding zero values where no rows exist (sparse)
我有一个带有 MultiIndex 的 Pandas DataFrame。 MultiIndex 的值在 (0,0)
到 (1000,1000)
范围内,列有两个字段 p
和 q
.
但是,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)
我有一个带有 MultiIndex 的 Pandas DataFrame。 MultiIndex 的值在 (0,0)
到 (1000,1000)
范围内,列有两个字段 p
和 q
.
但是,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)