【问题标题】:pandas multi index sort with several conditions具有多个条件的熊猫多索引排序
【发布时间】:2021-07-14 00:55:56
【问题描述】:

我有一个如下所示的数据框,

  MATERIALNAME CURINGMACHINE  HEADERCOUNTER
0         1015        PPU03R           1529
1         3005        PPY12L            305
2         3005        PPY12R            359
3         3005        PPY12R            404
4         K843       PPZB06L            435
5         K928        PPZ03L           1850

我从这个 df 创建了一个数据透视表,

pivot = pd.pivot_table(df, index = ['MATERIALNAME', 'CURINGMACHINE'],
                       values = ['HEADERCOUNTER'],
                       aggfunc = 'count', fill_value = 0)
pivot    
(output)
                        HEADERCOUNTER
MATERIALNAME CURINGMACHINE               
1015         PPU03R                     1
3005         PPY12L                     1
             PPY12R                     2
K843         PPZB06L                    1
K928         PPZ03L                     1

我在这篇文章“pandas.concat”Pivot table subtotals in Pandas的帮助下添加了每个材料名称的小计

pivot = pd.concat([
    d.append(d.sum().rename((k, 'Total')))
    for k, d in pivot.groupby(level=0)
]).append(pivot.sum().rename(('Grand', 'Total')))

我的最终 df 是,

                            HEADERCOUNTER
MATERIALNAME CURINGMACHINE               
1015         PPU03R                     1
             Total                      1
3005         PPY12L                     1
             PPY12R                     2
             Total                      3
K843         PPZB06L                    1
             Total                      1
K928         PPZ03L                     1
             Total                      1
Grand        Total                      6

我想根据 'HEADERCOUNTER' 列进行排序。我正在使用这段代码,

sorted_df = pivot.sort_values(by =['HEADERCOUNTER'], ascending = False)

当我对其进行排序时,'MATERIALNAME' 列的效果如下所示,从 3005 代码中可以看到,'MATERIALNAME' 已损坏。

                            HEADERCOUNTER
MATERIALNAME CURINGMACHINE               
Grand        Total                      6
3005         Total                      3
             PPY12R                     2
1015         PPU03R                     1
             Total                      1
3005         PPY12L                     1
K843         PPZB06L                    1
             Total                      1
K928         PPZ03L                     1
             Total                      1

当我对它进行排序时,我想按那个顺序查看;

                            HEADERCOUNTER
MATERIALNAME CURINGMACHINE               
Grand        Total                      6
3005         Total                      3
             PPY12R                     2
             PPY12L                     1
1015         PPU03R                     1
             Total                      1
K843         PPZB06L                    1
             Total                      1
K928         PPZ03L                     1
             Total                      1

如果你有什么改变流程的建议,我也可以试试。

编辑: 我尝试了BENY的方法,但是当数据增加时它不起作用。

你可以在下面看到 not ok 结果;

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    通过添加argsort来修复它

    pivot = pivot.sort_values('HEADERCOUNTER',ascending=False)
    out = pivot.iloc[(-pivot.groupby(level=0)['HEADERCOUNTER'].transform('max')).argsort()]
    Out[136]: 
                                HEADERCOUNTER
    MATERIALNAME CURINGMACHINE               
    Grand        Total                      6
    3005         Total                      3
                 PPY12R                     2
                 PPY12L                     1
    1015         PPU03R                     1
                 Total                      1
    K843         PPZB06L                    1
                 Total                      1
    K928         PPZ03L                     1
                 Total                      1
    

    【讨论】:

    • 感谢您的回复。它适用于这些数据,但是当数据增加时它不起作用。就像我在问题中提到的那样,它再次划分了“材料名称”。
    猜你喜欢
    • 2016-07-12
    • 2020-04-27
    • 2017-03-17
    • 2017-04-12
    • 1970-01-01
    • 2016-10-16
    • 2019-01-19
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多