3

私は問題があります。これは私がしました:

In [405]: pippo=ass_t1.pivot_table(['Rotazioni a volume','Distribuzione Ponderata'],rows=['SEGM1','DESC']).sort()

In [406]: pippo
Out[406]: 
                      Distribuzione Ponderata  Rotazioni a volume
SEGM1 DESC                                                       
AD     ACCADINAROLO                    74.040       140249.693409
      ZYMIL AMALAT Z                   90.085       321529.053570
FUN   SPECIALMALAT S                   88.650       120711.182177
NORM   STD INNAROLO                    49.790       162259.216710
       STD P.NAROLO                    52.125      1252174.695695
       STD PLNAROLO                    54.230       213257.829615
      BONTA' MALAT B                   79.280       520454.366419
      DA STD RILGARD                   35.290       554927.497875
      OVANE VT.MANTO                   15.040       466232.639628
      WEIGHT MALAT W                   79.170       118628.572692

私の目標は、各「SEGM1」を「DistribuzionePonderata」でソートすることです。たとえば、「NORM」サブセットの最初の行は、「DistribuzionePonderata」のレベルが高い「BONTA」MALATBである必要があります。groupbyメソッドを使用して部分的に結果を達成できましたが、複数の列を設定することはできませんでした。誰かが私を助けてくれますか?

4

1 に答える 1

9
import io
import pandas as pd
import numpy as np

text = '''\
SEGM1\tDESC\tDistribuzione Ponderata\tRotazioni a volume
AD\tACCADINAROLO\t74.040\t140249.693409
AD\tZYMIL AMALAT Z\t90.085\t321529.053570
FUN\tSPECIALMALAT S\t88.650\t120711.182177
NORM\tSTD INNAROLO\t49.790\t162259.216710
NORM\tSTD P.NAROLO\t52.125\t1252174.695695
NORM\tSTD PLNAROLO\t54.230\t213257.829615
NORM\tBONTA' MALAT B\t79.280\t520454.366419
NORM\tDA STD RILGARD\t35.290\t554927.497875
NORM\tOVANE VT.MANTO\t15.040\t466232.639628
NORM\tWEIGHT MALAT W\t79.170\t118628.572692
'''

df = pd.read_csv(io.BytesIO(text), delimiter = '\t',
                 index_col = (0,1),)

key1 = df.index.labels[0]
key2 = df['Distribuzione Ponderata'].rank(ascending=False)
sorter = np.lexsort((key2, key1))

sorted_df = df.take(sorter)
print(sorted_df)

収量

                      Distribuzione Ponderata  Rotazioni a volume
SEGM1 DESC                                                       
AD    ZYMIL AMALAT Z                   90.085       321529.053570
      ACCADINAROLO                     74.040       140249.693409
FUN   SPECIALMALAT S                   88.650       120711.182177
NORM  BONTA' MALAT B                   79.280       520454.366419
      WEIGHT MALAT W                   79.170       118628.572692
      STD PLNAROLO                     54.230       213257.829615
      STD P.NAROLO                     52.125      1252174.695695
      STD INNAROLO                     49.790       162259.216710
      DA STD RILGARD                   35.290       554927.497875
      OVANE VT.MANTO                   15.040       466232.639628

私はここでこのトリックを学びました。重要なアイデアは、numpy.lexsortを使用することです。

于 2012-12-29T21:17:32.070 に答える