我想从DataFrame构造一个时间序列。它是多索引的,并且一个索引内的每一步都对应于恒定的时间偏移。但是,索引并不全部存在。如何扩展数据(以用于将来填充或其他插补),以使某些级别的索引被迫具有所有值?
import autoit
autoit.win_wait_active("Open File", 5)
autoit.send(path)
autoit.send("{ENTER}")
这是一个可以尝试的框架:
# 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
我具有已经设置了索引的形式的DataFrame。在最好的情况下,我希望能够操纵MultiIndex,这样就不必将级别转换回列。但我知道是否需要这样做。
答案 0 :(得分:1)
将MultiIndex.from_product
与Series.reindex
一起使用:
df = pd.DataFrame({'I0': [0,0,1,2,2,3], 'I1': [0,1,0,0,1,1], 'Value': [1,2,3,5,6,8]})
mux = pd.MultiIndex.from_product([df['I0'].unique(), [0,1]], names=['I0','I1'])
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
编辑:
在更改了一些讨论解决方案后-要保留MultiIndex的其他级别,首先需要将级别转换为整数(以避免按字符串排序),然后将unstack
与stack
一起使用。要保留NaN
,请使用参数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)