1

pandas で pivot_table を使用して、次のデータセットで目的の出力 (以下に示す) または同様のものを達成できますか。私は次のようなことをしようとしています:

pivot_table(df, rows=['region'], cols=['area','distributor','salesrep'], 
            aggfunc=np.sum, margins=True).stack(['area','distributor','salesrep'])

しかし、地域ごとの小計しか取得していません。領域を列から行に移動すると、領域ごとの小計のみが取得されます。

データセット:

地域 エリア 販売代理店 販売担当者 販売送り状_カウント
セントラル バターワース HIN MARKETING TLS 500 25
セントラル バターワース HIN MARKETING TLS 500 25
セントラル バターワース HIN MARKETING OSE 500 25
セントラル バターワース HIN MARKETING OSE 500 25
セントラル バターワース KWANG HENGG TCS 500 25
セントラル バターワース KWANG HENGG TCS 500 25
セントラル バターワース KWANG HENG LBH 500 25
セントラル バターワース KWANG HENG LBH 500 25
セントラル イポー SGH エデラン チャン 500 25
セントラル イポー SGH エデラン チャン 500 25
セントラル イポー SGH EDERAN KAMACHI 500 25
セントラル イポー SGH EDERAN KAMACHI 500 25
セントラル イポー CORE SYN LILIAN 500 25
セントラル イポー CORE SYN LILIAN 500 25
セントラル イポー CORE SYN TEOH 500 25
セントラル イポー CORE SYN TEOH 500 25
東 JB 雷華 NF05 500 25
東 JB 雷華 NF05 500 25
東 JB 雷華 NF06 500 25
東 JB 雷華 NF06 500 25
東 JB WONDER F&B SEREN 500 25
東 JB WONDER F&B SEREN 500 25
東JB WONDER F&B MONC 500 25
東JB WONDER F&B MONC 500 25
東PJ PENGEDAR NORM 500 25
東PJ PENGEDAR NORM 500 25
東PJ PENGEDAR SIMON 500 25
東PJ PENGEDAR SIMON 500 25
東PJ HEBAT OGI 500 25
東PJ HEBAT OGI 500 25
東PJ HEBAT MIGI 500 25
東PJ HEBAT MIGI 500 25

望ましい出力:

地域 エリア ディストリビューター 販売担当者 請求書_カウント 販売
総計 800 16000
中央 中央 合計 400 8000
中央バターワース バターワース 合計 200 4000
セントラル バターワース HIN MARKETING HIN MARKETING 合計 100 2000
セントラル バターワース HIN MARKETING OSE 50 1000
セントラル バターワース HIN MARKETING TLS 50 1000
セントラル バターワース KWANG HENG KWANG HENG 合計 100 2000
セントラル バターワース KWANG HENG LBH 50 1000
セントラル バターワース KWANG HENG TCS 50 1000
セントラル イポー イポー 合計 200 4000
中央イポー CORE SYN CORE SYN 合計 100 2000
セントラル イポー CORE SYN LILIAN 50 1000
セントラル イポー CORE SYN TEOH 50 1000
中央イポー SGH EDERAN SGH EDERAN 合計 100 2000
セントラル イポー SGH エデラン チャン 50 1000
セントラル イポー SGH EDERAN KAMACHI 50 1000
東 東 合計 400 8000
東JB JB 合計 200 4000
東 JB LEI WAH LEI WAH 合計 100 2000
東 JB 雷華 NF05 50 1000
東 JB レイワー NF06 50 1000
東 JB WONDER F&B WONDER F&B 合計 100 2000
東 JB WONDER F&B MONC 50 1000
東 JB WONDER F&B SEREN 50 1000
東 PJ PJ 合計 200 4000
East PJ HEBAT HEBAT 合計 100 2000
東PJ HEBAT MIGI 50 1000
東PJ HEBAT OGI 50 1000
East PJ PENGEDAR PENDEGAR 合計 100 2000
東PJ PENGEDAR NORM 50 1000
東PJ PENGEDAR SIMON 50 1000
4

2 に答える 2

1

groupby代わりに使用できますpivot_table

import numpy as np
import pandas as pd


def label(ser):
    return '{s} Total'.format(s=ser)

filename = 'data.txt'
df = pd.read_table(filename, delimiter='\t')

total = pd.DataFrame({'region': ['Grand Total'],
                      'invoice_count': df['invoice_count'].sum(),
                      'sales': df['sales'].sum()})
total['total_rank'] = 1

region_total = df.groupby(['region'], as_index=False).sum()
region_total['area'] = region_total['region'].apply(label)
region_total['region_rank'] = 1

area_total = df.groupby(['region', 'area'], as_index=False).sum()
area_total['distributor'] = area_total['area'].apply(label)
area_total['area_rank'] = 1

dist_total = df.groupby(
    ['region', 'area', 'distributor'], as_index=False).sum()
dist_total['salesrep'] = dist_total['distributor'].apply(label)

rep_total = df.groupby(
    ['region', 'area', 'distributor', 'salesrep'], as_index=False).sum()

# UNION the DataFrames into one DataFrame
result = pd.concat([total, region_total, area_total, dist_total, rep_total])

# Replace NaNs with empty strings
result.fillna({'region': '', 'area': '', 'distributor': '', 'salesrep':
              ''}, inplace=True)

# Reorder the rows
sorter = np.lexsort((
    result['distributor'].rank(),
    result['area_rank'].rank(),
    result['area'].rank(),
    result['region_rank'].rank(),
    result['region'].rank(),
    result['total_rank'].rank()))
result = result.take(sorter)
result = result.reindex(
    columns=['region', 'area', 'distributor', 'salesrep', 'invoice_count', 'sales'])
print(result.to_string(index=False))

収量

      region           area        distributor             salesrep  invoice_count  sales
 Grand Total                                                                   800  16000
     Central  Central Total                                                    400   8000
     Central    Butterworth  Butterworth Total                                 200   4000
     Central    Butterworth      HIN MARKETING  HIN MARKETING Total            100   2000
     Central    Butterworth      HIN MARKETING                  OSE             50   1000
     Central    Butterworth      HIN MARKETING                  TLS             50   1000
     Central    Butterworth         KWANG HENG     KWANG HENG Total            100   2000
     Central    Butterworth         KWANG HENG                  LBH             50   1000
     Central    Butterworth         KWANG HENG                  TCS             50   1000
     Central           Ipoh         Ipoh Total                                 200   4000
     Central           Ipoh           CORE SYN       CORE SYN Total            100   2000
     Central           Ipoh           CORE SYN               LILIAN             50   1000
     Central           Ipoh           CORE SYN                 TEOH             50   1000
     Central           Ipoh         SGH EDERAN     SGH EDERAN Total            100   2000
     Central           Ipoh         SGH EDERAN                 CHAN             50   1000
     Central           Ipoh         SGH EDERAN              KAMACHI             50   1000
        East     East Total                                                    400   8000
        East             JB           JB Total                                 200   4000
        East             JB            LEI WAH        LEI WAH Total            100   2000
        East             JB            LEI WAH                 NF05             50   1000
        East             JB            LEI WAH                 NF06             50   1000
        East             JB         WONDER F&B     WONDER F&B Total            100   2000
        East             JB         WONDER F&B                 MONC             50   1000
        East             JB         WONDER F&B                SEREN             50   1000
        East             PJ           PJ Total                                 200   4000
        East             PJ              HEBAT          HEBAT Total            100   2000
        East             PJ              HEBAT                 MIGI             50   1000
        East             PJ              HEBAT                  OGI             50   1000
        East             PJ           PENGEDAR       PENGEDAR Total            100   2000
        East             PJ           PENGEDAR                 NORM             50   1000
        East             PJ           PENGEDAR                SIMON             50   1000
于 2013-04-14T18:41:16.130 に答える