【问题标题】:Append DataFrame to multi-indexed DataFrame将 DataFrame 附加到多索引 DataFrame
【发布时间】:2018-07-15 03:31:09
【问题描述】:

我有一个DataFrame,其中包含三个如下所示的索引:

                                               stat1             stat2
sample                        env  run                                                  
sample1                       0    0          36.214             71
                                   1          31.808             71
                                   2          28.376             71
                                   3          20.585             71
sample2                       0    0           2.059             29
                                   1           2.070             29
                                   2           2.038             29

这表示在不同数据样本上运行的过程。这个过程在不同的环境中运行多次,从而使结果合格。

这听起来很简单,但我在尝试将新环境结果添加为 DataFrame 时遇到了麻烦:

            stat1          stat2
run                                                  
0           0.686             29
1           0.660             29
2           0.663             29

这应该在df.loc[["sample1", 1]] 下编入索引。我试过这个:

df.loc[["sample1", 1]] = result

并使用DataFrame.append。但是第一个只是提出了KeyError,而第二个似乎根本没有修改DataFrame

我在这里错过了什么?

编辑:补充说,当使用appenddf.loc["sample"].append(result) 时,问题是它弄乱了多索引。转化为单个索引,将之前的多索引合并为一个元组,如(0, 0)(0, 1)代表环境0、运行1等;并且附加的DataFrame(代表每次运行的范围索引)的索引成为新的不需要的索引。

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    这里问题的核心是索引的差异。解决此问题的一种方法是更改​​结果的索引以包含要设置的 0,1 级别,然后使用 concat 附加数据帧。看下面的例子

    In [68]: result.index = list(zip(["sample1"]*len(result), [1]*len(result),result
        ...: .index))
    
    In [69]: df = pd.concat([df,result])
             df
    Out[69]: 
                      stat1  stat2
    sample  env run               
    sample1 0   0    36.214     71
                1    31.808     71
                2    28.376     71
                3    20.585     71
    sample2 0   0     2.059     29
                1     2.070     29
                2     2.038     29
    sample1 1   0     0.686     29
                1     0.660     29
                2     0.663     29
    

    编辑:一旦索引改变,你甚至可以使用追加

    In [21]: result.index = list(zip(["sample1"]*len(result), [1]*len(result),result
        ...: .index))
    
    In [22]: df.append(result)
    Out[22]: 
                      stat1  stat2
    sample  env run               
    sample1 0   0    36.214     71
                1    31.808     71
                2    28.376     71
                3    20.585     71
    sample2 0   0     2.059     29
                1     2.070     29
                2     2.038     29
    sample1 1   0     0.686     29
                1     0.660     29
                2     0.663     29
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多