填写缺失的 DataFrame 索引
fill in missing DataFrame indices
给定两个 pandas 数据帧 dfa
和 dfb
,如何确保每个数据帧的 MultiIndex 包含另一个数据帧的所有行?
In [147]: dfa
Out[147]:
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
3 8 13.5
4 9 14.0
In [148]: dfb
Out[148]:
c
a b
0 5 10
2 7 12
3 8 13
4 9 14
这里,dfb
缺少索引(1, 6):
In [149]: dfa - dfb
Out[149]:
c
a b
0 5 0.0
1 6 NaN
2 7 0.0
3 8 0.5
4 9 0.0
...但是 dfa
也可能缺少来自 dfb
的索引。该值应为 0
,我们在每个数据框中插入一个缺失的索引。
换句话说,每个DataFrame的索引应该是两个MultiIndexes的并集,其中添加的行的值为0。
如果需要将 NaN
替换为某个值,我认为您需要 DataFrame.sub
和参数 fill_value
:
df = dfa.sub(dfb, fill_value=0)
print (df)
c
a b
0 5 0.0
1 6 11.0
2 7 0.0
3 8 0.5
4 9 0.0
df = dfb.sub(dfa, fill_value=0)
print (df)
c
a b
0 5 10
1 6 0
2 7 12
3 8 13
4 9 14
或者如果需要 union
of indexes add reindex
:
mux = dfa.index.union(dfb.index)
print (mux)
MultiIndex(levels=[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]],
labels=[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]],
names=['a', 'b'],
sortorder=0)
print (dfa.reindex(mux, fill_value=0))
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
3 8 13.5
4 9 14.0
print (dfb.reindex(mux, fill_value=0))
c
a b
0 5 10
1 6 0
2 7 12
3 8 13
4 9 14
对于所有 出现的 MultiIndex 值 的 完全笛卡尔积 的扩展,这很好地工作:
from itertools import product
df = dfa.loc[0:2]
print(df)
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
# build full cartesian product index
cpr_index = product(*(df.index.get_level_values(icol) for icol in df.index.names))
# and generate the missing elements, filling with -1
print(df.reindex(cpr_index, fill_value=-1))
c
a b
0 5 10.0
6 -1.0
7 -1.0
1 5 -1.0
6 11.0
7 -1.0
2 5 -1.0
6 -1.0
7 12.0
基本上这会创建一个完全填充的张量或矩阵填充默认值。
对于部分完整人口(例如:对于所有 a >= 1),必须相应地制作产品。
给定两个 pandas 数据帧 dfa
和 dfb
,如何确保每个数据帧的 MultiIndex 包含另一个数据帧的所有行?
In [147]: dfa
Out[147]:
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
3 8 13.5
4 9 14.0
In [148]: dfb
Out[148]:
c
a b
0 5 10
2 7 12
3 8 13
4 9 14
这里,dfb
缺少索引(1, 6):
In [149]: dfa - dfb
Out[149]:
c
a b
0 5 0.0
1 6 NaN
2 7 0.0
3 8 0.5
4 9 0.0
...但是 dfa
也可能缺少来自 dfb
的索引。该值应为 0
,我们在每个数据框中插入一个缺失的索引。
换句话说,每个DataFrame的索引应该是两个MultiIndexes的并集,其中添加的行的值为0。
如果需要将 NaN
替换为某个值,我认为您需要 DataFrame.sub
和参数 fill_value
:
df = dfa.sub(dfb, fill_value=0)
print (df)
c
a b
0 5 0.0
1 6 11.0
2 7 0.0
3 8 0.5
4 9 0.0
df = dfb.sub(dfa, fill_value=0)
print (df)
c
a b
0 5 10
1 6 0
2 7 12
3 8 13
4 9 14
或者如果需要 union
of indexes add reindex
:
mux = dfa.index.union(dfb.index)
print (mux)
MultiIndex(levels=[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]],
labels=[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]],
names=['a', 'b'],
sortorder=0)
print (dfa.reindex(mux, fill_value=0))
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
3 8 13.5
4 9 14.0
print (dfb.reindex(mux, fill_value=0))
c
a b
0 5 10
1 6 0
2 7 12
3 8 13
4 9 14
对于所有 出现的 MultiIndex 值 的 完全笛卡尔积 的扩展,这很好地工作:
from itertools import product
df = dfa.loc[0:2]
print(df)
c
a b
0 5 10.0
1 6 11.0
2 7 12.0
# build full cartesian product index
cpr_index = product(*(df.index.get_level_values(icol) for icol in df.index.names))
# and generate the missing elements, filling with -1
print(df.reindex(cpr_index, fill_value=-1))
c
a b
0 5 10.0
6 -1.0
7 -1.0
1 5 -1.0
6 11.0
7 -1.0
2 5 -1.0
6 -1.0
7 12.0
基本上这会创建一个完全填充的张量或矩阵填充默认值。 对于部分完整人口(例如:对于所有 a >= 1),必须相应地制作产品。