强制索引值存在

时间:2018-09-02 10:24:35

标签: python pandas

我想从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,这样就不必将级别转换回列。但我知道是否需要这样做。

1 个答案:

答案 0 :(得分:1)

MultiIndex.from_productSeries.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的其他级别,首先需要将级别转换为整数(以避免按字符串排序),然后将unstackstack一起使用。要保留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)
相关问题