Python 强制显示索引值

Python 强制显示索引值,python,pandas,Python,Pandas,我想从数据帧构造一个时间序列。它是多索引的,在一个索引中的每一个移动都对应于时间上的恒定移动。然而,这些指数并非都存在。我如何扩展数据(用于未来填充或其他插补),使某些级别的指数被迫具有其所有值 # Example: here I0 is a running number and I1 to be forced to have 0 and 1 for every I0. I0 | I1 || Value -> I0 | I1 || Value ---+----++-----

我想从数据帧构造一个时间序列。它是多索引的,在一个索引中的每一个移动都对应于时间上的恒定移动。然而,这些指数并非都存在。我如何扩展数据(用于未来填充或其他插补),使某些级别的指数被迫具有其所有值

# Example: here I0 is a running number and I1 to be forced to have 0 and 1 for every I0.

I0 | I1 || Value     ->    I0 | I1 || Value
---+----++-------          ---+----++-------
 0 |  0 ||   1              0 |  0 ||   1
   |  1 ||   2                |  1 ||   2
 1 |  0 ||   3              1 |  0 ||   3
 2 |  0 ||   5                |  1 ||   NaN
   |  1 ||   6              2 |  0 ||   5
 3 |  1 ||   8                |  1 ||   6
                            3 |  0 ||   NaN
                              |  1 ||   8
这里有一个框架可以试穿:

df = pd.DataFrame({'I0': [0,0,1,2,2,3], 'I1': [0,1,0,0,1,1], 'Value': [1,2,3,5,6,8]})
df = df.set_index(['I0', 'I1'])
澄清 我的数据帧的形式是索引已经设置好了。在最好的情况下,我希望能够操纵多索引,这样级别就不必转换回列。但如果需要,我可以理解。

与以下一起使用:



编辑:

在一些讨论解决方案被更改后——为了保留多索引的其他级别,首先需要将级别转换为整数(以避免作为字符串排序),然后使用。要保留
NaN
s,请使用参数
dropna=False

a = df.index.get_level_values(0).astype(int)
b = df.index.get_level_values(1).astype(int)
c = df.index.get_level_values(2)   # String index level
d = df.index.get_level_values(3).astype(int)

df.index = pd.MultiIndex.from_arrays([a, b, c, d], names=df.index.names)

df = df.unstack().stack(dropna=False)

为了让你的大脑更灵活一点,索引是否需要转换成列?显然,在调用
set\u index
之前,您对数据帧进行了操作。另外,如果有多个外部索引级别需要保留,这是如何进行的?嗯,奇怪,至少我不能用
df[idx]
引用索引级别。。。抛出一个键错误,但在上面的代码中引用了索引级别。对于第二个问题:我有意简化原始问题,以获得一般解决方案,但我有四个索引级别,只有最里面的索引级别必须具有这种交替的0,1,0,1模式。所以我想保留外部索引级别,只扩展一个级别。其中一个级别只包含有关所讨论行的辅助信息。所以,如果我做笛卡尔积,我会得到比我们想要的更多的东西。
mux = pd.MultiIndex.from_product([np.arange(df['I0'].max() + 1), 
                                  df['I1'].unique()], 
                                  names=['I0','I1'])
mux = pd.MultiIndex.from_product([df['I0'].unique(), df['I1'].unique()], names=['I0','I1'])
df = df.set_index(['I0', 'I1']).reindex(mux)

print (df)
       Value
I0 I1       
0  0     1.0
   1     2.0
1  0     3.0
   1     NaN
2  0     5.0
   1     6.0
3  0     NaN
   1     8.0
a = df.index.get_level_values(0).astype(int)
b = df.index.get_level_values(1).astype(int)
c = df.index.get_level_values(2)   # String index level
d = df.index.get_level_values(3).astype(int)

df.index = pd.MultiIndex.from_arrays([a, b, c, d], names=df.index.names)

df = df.unstack().stack(dropna=False)