【问题标题】:Multiindex on DataFrames and sum in PandasDataFrames 上的多索引和 Pandas 中的 sum
【发布时间】:2015-08-20 11:46:21
【问题描述】:

我目前正在尝试使用 Pandas MultiIndex 属性。我正在尝试以一种智能的方式根据其列对现有的 DataFrame-object df_original 进行分组,因此正在考虑 MultiIndex。

print df_original =

       by_currency   by_portfolio    A  B  C
1        AUD          a              1  2  3
2        AUD          b              4  5  6
3        AUD          c              7  8  9
4        AUD          d              10 11 12
5        CHF          a              13 14 15 
6        CHF          b              16 17 18
7        CHF          c              19 20 21
8        CHF          d              22 23 24

现在,我想要的是一个 MultiIndex DataFrame 对象,以 A, BCby_portfolio 作为索引。看起来像

              CHF     AUD
A       a     13      1
        b     16      4   
        c     19      7
        d     22      10
B       a     14      2
        b     17      5
        c     20      8
        d     23      11
C       a     15      3
        b     18      6
        c     21      9
        d     24      12

我已经尝试将df_original 中的所有列和追捧的索引制作成列表对象,然后从那里创建一个新的DataFrame。这似乎有点麻烦,我不知道如何添加实际值。

也许某种groupby 更适合这个目的?问题是我需要能够将此数据添加到另一个类似的 DataFrame,所以我需要生成的 DataFrame 以后能够添加到另一个。

谢谢

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    您可以使用stackunstack 的组合:

    In [50]: df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0)
    Out[50]:
    by_currency     AUD  CHF
    by_portfolio
    a            A    1   13
                 B    2   14
                 C    3   15
    b            A    4   16
                 B    5   17
                 C    6   18
    c            A    7   19
                 B    8   20
                 C    9   21
    d            A   10   22
                 B   11   23
                 C   12   24
    

    为了得到你想要的结果,我们只需要交换索引的级别:

    In [51]: df2 = df.set_index(['by_currency', 'by_portfolio']).stack().unstack(0)
    
    In [52]: df2.columns.name = None
    
    In [53]: df2.index = df2.index.swaplevel(0,1)
    
    In [55]: df2 = df2.sort_index()
    
    In [56]: df2
    Out[56]:
                    AUD  CHF
      by_portfolio
    A a               1   13
      b               4   16
      c               7   19
      d              10   22
    B a               2   14
      b               5   17
      c               8   20
      d              11   23
    C a               3   15
      b               6   18
      c               9   21
      d              12   24
    

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2018-11-14
      • 2021-10-10
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多