熊猫:在多索引数据框中重新索引和插值

时间:2018-12-14 22:52:15

标签: python pandas

我在理解熊猫reindex时遇到了麻烦。我进行了一系列测量,并融入了多索引df中,我想重新索引和内插这些测量以使其与其他数据对齐。

我的实际数据具有〜7个索引级别和几种不同的度量。我希望这个玩具数据问题的解决方案适用于我的真实数据。这是“小数据”;每个单独的测量值都是几KB。

这是一对玩具问题,一个显示预期的行为,一个似乎什么也没做。

单级索引,按预期工作:

"""
step,value
1,1
3,2
5,1
"""
df_i = pd.read_clipboard(sep=",").set_index("step")
print(df_i)

new_index = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

df_i = df_i.reindex(new_index).interpolate()
print(df_i)

输出,原始df以及重新索引和内插的输出:

      value
step       
1         1
3         2
5         1
      value
step       
1       1.0
2       1.5
3       2.0
4       1.5
5       1.0
6       1.0
7       1.0
8       1.0
9       1.0

效果很好。

多索引,当前不起作用:

"""
sample,meas_id,step,value
1,1,1,1
1,1,3,2
1,1,5,1
1,2,3,2
1,2,5,2
1,2,7,1
1,2,9,0
"""
df_mi = pd.read_clipboard(sep=",").set_index(["sample", "meas_id", "step"])
print(df_mi)

df_mi = df_mi.reindex(new_index, level="step").interpolate()
print(df_mi)

输出,在重新索引后(因此在插值后)不变:

                     value
sample meas_id step       
1      1       1         1
               3         2
               5         1
       2       3         2
               5         2
               7         1
               9         0


                     value
sample meas_id step       
1      1       1         1
               3         2
               5         1
       2       3         2
               5         2
               7         1
               9         0

如何实际上为多索引df中的列重新编制索引?

假设线性插值,这是我想要的输出:

                     value
sample meas_id step       
1      1       1         1
               2       1.5
               3         2
               5         1
               6         1
               7         1
               8         1
               9         1
       2       1       NaN (or 2)
               2       NaN (or 2)
               3         2
               4         2
               5         2
               6       1.5
               7         1
               8       0.5
               9         0

我花了一些真诚的时间查看SO,如果答案在那里,我会错过它:

Fill multi-index Pandas DataFrame with interpolation

Resampling Within a Pandas MultiIndex

pandas multiindex dataframe, ND interpolation for missing values

Fill multi-index Pandas DataFrame with interpolation

https://pandas.pydata.org/pandas-docs/stable/basics.html#basics-reindexing

可能相关的GitHub问题:

https://github.com/numpy/numpy/issues/11975

https://github.com/pandas-dev/pandas/issues/23104

https://github.com/pandas-dev/pandas/issues/17132

1 个答案:

答案 0 :(得分:1)

IIUC使用dst创建索引,然后执行MultiIndex.from_product

reindex

我的想法

idx=pd.MultiIndex.from_product([df_mi.index.levels[0],df_mi.index.levels[1],new_index])    
df_mi.reindex(idx).interpolate()
Out[161]: 
          value
1 1 1  1.000000
    2  1.500000
    3  2.000000
    4  1.500000
    5  1.000000
    6  1.142857
    7  1.285714
    8  1.428571
    9  1.571429
  2 1  1.714286 # here is bad , it take previous value into consideration 
    2  1.857143
    3  2.000000
    4  2.000000
    5  2.000000
    6  1.500000
    7  1.000000
    8  0.500000
    9  0.000000