【问题标题】:How to sort pandas pivot_table based on newest date within level?如何根据级别内的最新日期对熊猫数据透视表进行排序?
【发布时间】:2016-02-27 03:16:14
【问题描述】:

我已经按照我想要的日期顺序创建了一个 DataFrame,但是,当我将它放入数据透视表时,顺序会发生变化。

我想根据给定级别内任何行的最新日期对数据透视表进行排序

data = [['yellow',1,'02/01/2015'],
        ['yellow',2,'04/01/2015'],
        ['green',3,'03/01/2015'],
        ['red',4,'01/01/2015']]

    df = pd.DataFrame(data, columns=['colour','number','date'])
    df.pivot_table(index=['number','date'])

结果是

                    number
colour  date    
green   03/01/2015  3
red     01/01/2015  4
yellow  02/01/2015  1
        04/01/2015  2

我希望最终结果是一个颜色列表,其中最新日期位于顶部,基本上是对每行最新日期的排序(周围有星号的日期)。所以结果是:-

                    number
colour  date    
yellow  02/01/2015  2
        *04/01/2015*  3
green   *03/01/2015*    4
red     *01/01/2015*    1

我能想到三个解决方案,但我无法解决

a) 获取 pivot_table 以保持原始顺序 b) 使用沿着 latest_date_in_rows 行的函数对 pivot_table 进行排序 c) 创建一个额外的列,其中包含每种颜色的最新日期

不确定进入熊猫世界的正确路线是什么,但目前我被困住了:(

【问题讨论】:

    标签: python sorting date pandas pivot-table


    【解决方案1】:

    您可以在旋转之前记住旧的multiindex,然后通过旧的multiindex 输出数据帧reindex

    import pandas as pd
    
    data = [['yellow',1,'02/01/2015'],
            ['yellow',2,'04/01/2015'],
            ['green',3,'03/01/2015'],
            ['red',4,'01/01/2015']]
    df = pd.DataFrame(data, columns=['colour','number','date'])
    #simulate datetime column date
    df['date'] = pd.to_datetime(df['date'])
    #set index from columns colour and date
    df = df.set_index(['colour', 'date'])
    print df
    #                   number
    #colour date              
    #yellow 2015-02-01       1
    #       2015-04-01       2
    #green  2015-03-01       3
    #red    2015-01-01       4
    
    #set old index to variable idx
    idx = df.index
    print df.index
    
    #pivot table, it doesn't work with test data
    df.pivot_table(index=['number','date'])
    
    #reindex by old multiindex
    df1 = df.reindex(idx)
    print df1
    #                   number
    #colour date              
    #yellow 2015-02-01       1
    #       2015-04-01       2
    #green  2015-03-01       3
    #red    2015-01-01       4
    

    编辑:

    我认为问题在于原始数据框未排序。 它的multiindex 是:

    MultiIndex(levels=[[u'green', u'red', u'yellow'], [u'2015-01-01', u'2015-02-01', u'2015-03-01', u'2015-04-01']],
               labels=[[2, 2, 0, 1], [1, 3, 2, 0]],
               names=[u'colour', u'date'])
    

    输出数据框有multiindex,按colour排序:

    MultiIndex(levels=[[u'green', u'red', u'yellow'], [u'2015-01-01', u'2015-02-01', u'2015-03-01', u'2015-04-01']],
               labels=[[0, 1, 2, 2], [2, 0, 1, 3]],
               names=[u'colour', u'date'])
    

    你可以按级别排序date,但是多索引和输出是:

    idx1 = df.sortlevel(level='date').index
    print idx1
    MultiIndex(levels=[[u'green', u'red', u'yellow'], [u'2015-01-01', u'2015-02-01', u'2015-03-01', u'2015-04-01']],
               labels=[[1, 2, 0, 2], [0, 1, 2, 3]],
               names=[u'colour', u'date'])
    
    
    #reindex by idx1
    df1 = df.reindex(idx)
                       number
    colour date              
    red    2015-01-01       4
    yellow 2015-02-01       1
    green  2015-03-01       3
    yellow 2015-04-01       2
    

    所以解决方案是reindex by original multiindex

    【讨论】:

    • 谢谢耶兹瑞尔。这听起来很有意义。我尝试了您的第一个答案,但遇到了一些问题。我明天再看看你的第二个答案。
    • 我已经接受了你的回答,因为它看起来应该可以工作,但我仍在 Pandas 学习曲线上,所以我还没有完全工作。
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2012-05-15
    • 2020-10-08
    • 2020-11-06
    • 2014-12-29
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多