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)