【问题标题】:How to organize structured data in pandas dataframe如何在 pandas 数据框中组织结构化数据
【发布时间】:2012-09-14 16:37:29
【问题描述】:

假设我有一个 DataFrame,它的子索引结构如下所示,带有“date”、“tenor”、“mat”和“strike”,并且要观察的字段存储在“vol”列中:

date     tenor   mat strike    vol                                      
20120903 3m      1y  0.25      52.
                     0.50      51.
                     1.00      49.
20120903 3m      5y  0.25      32.
                     0.50      55.
                     1.00      23.
20120903 3m      10y 0.25      65.
                     0.50      55.
                     1.00      19.
20120904 3m      1y  0.25      32.
                     0.50      57.
                     1.00      44.
20120904 3m      5y  0.25      54.
                     0.50      50.
                     1.00      69.
20120904 3m      10y 0.25      42.
                     0.50      81.
                     1.00      99.

假设我想通过获取一个新的数据框来重组这些数据数据框以这样的方式:

date     tenor   values                                                       
20120903 3m      [[1y,5y,10y],[0.25, 0.50, 1.00], [52., 51., 49.],
                                                  [32., 55., 23.],
                                                  [65., 55., 19.]]
20120904 3m      [[1y,5y,10y],[0.25, 0.50, 1.00], [32., 57., 44.],
                                                  [54., 50., 69.],
                                                  [42., 81., 99.]]

我尝试了“unstack”、“groupby”和“pivot”的各种尝试,但没有成功。我只能通过使用大量 python 矢量操作来实现我的目标,但这是一个缓慢且低效的过程。为了获得相同的结果,是否有任何特定的、更有效的 pandas 程序?我迷路了…… 谢谢你的帮助, 毛里齐奥

【问题讨论】:

    标签: python pandas pivot-table


    【解决方案1】:

    这样的事情怎么样:

    In [111]: df
    Out[111]: 
                    mat  strike  vol
    date     tenor                  
    20120903 3m      1y    0.25   52
             3m      1y    0.50   51
             3m      1y    1.00   49
             3m      5y    0.25   32
             3m      5y    0.50   55
             3m      5y    1.00   23
             3m     10y    0.25   65
             3m     10y    0.50   55
             3m     10y    1.00   19
    20120904 3m      1y    0.25   32
             3m      1y    0.50   57
             3m      1y    1.00   44
             3m      5y    0.25   54
             3m      5y    0.50   50
             3m      5y    1.00   69
             3m     10y    0.25   42
             3m     10y    0.50   81
             3m     10y    1.00   99
    
    In [112]: def agg_func(x):
        mats = list(x.mat.unique())
        strikes = list(x.strike.unique())
        vols = x.pivot('mat', 'strike', 'vol').reindex(mats, columns=strikes)
        return [mats, strikes, vols.values.tolist()]
       .....: 
    
    In [113]: rs = df.groupby(level=['date', 'tenor']).apply(agg_func)
    
    In [114]: rs
    Out[114]: 
    date      tenor
    20120903  3m       [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[52.0...
    20120904  3m       [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[32.0...
    
    In [115]: rs.values[0]
    Out[115]: 
    [['1y', '5y', '10y'],
     [0.25, 0.5, 1.0],
     [[52.0, 51.0, 49.0], [32.0, 55.0, 23.0], [65.0, 55.0, 19.0]]]
    

    【讨论】:

    • 嗨,Chang,感谢您的回复:最后一个问题,您如何获得第一行的“df”?我的意思是,你的看起来与我原来的不同,事实上你最初似乎只有三列('mat''strike'和'vol'),而我的只有'vol'值,其他列是索引
    • 我刚刚将您的 sn-p 粘贴进去。您可以使用 set_indexreset_index 将某些列设为索引,反之亦然。我的 df 有一个以“日期”和“男高音”为级别的 MultiIndex。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2014-06-22
    • 2021-12-22
    • 1970-01-01
    • 2016-09-23
    • 2015-12-16
    • 2016-03-25
    相关资源
    最近更新 更多