pandas.crosstab нарезка с добавленными итогами - PullRequest
0 голосов
/ 08 октября 2018

В настоящее время я действительно борюсь с данными.Запустив код: (res_sum = имя фрейма данных)

summary_table = pd.crosstab(index=[res_sum["Type"],res_sum["Size"]],
                        columns=res_sum["Found"],margins=True)
summary_table = summary_table.div(summary_table["All"] / 100, axis=0)

Результат:

Found                 Exact   Near     No    All
Type        Size                            
X           10          0.0    0.0  100.0  100.0
            100         0.0  100.0    0.0  100.0
            500         0.0  100.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0
Y           10          0.0  100.0    0.0  100.0
            100         0.0    0.0  100.0  100.0
            500         0.0  100.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0
....... (more)
All                     5.0   65.0   30.0  100.0

Я хочу что-то вроде этого:

Found                 Exact   Near     No    All
Type        Size                            
X           10          0.0    0.0  100.0  100.0
            100         0.0  100.0    0.0  100.0
            500         0.0  100.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0
Total X                 0.0   80.0   20.0
Y           10          0.0  100.0    0.0  100.0
            100         0.0    0.0  100.0  100.0
            500         0.0  100.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0
Total Y                 0.0   80.0   20.0
.......(more)
All                     5.0   65.0   30.0  100.0

Это неЭто не представляется возможным в pd.crosstab, поэтому я попытался создать подмножества каждого типа, а затем снова вставьте кадры данных вместе.Это работает, но это удаляет все суммы.Например, код:

x5 = summary_table.loc(axis=0)[['X'], slice(None)]
x6 = summary_table.loc(axis=0)[['Y'], slice(None)]

frames = [x5, x6]
result = pd.concat(frames)

приводит к этому, что полностью игнорирует «margins = True» из pd.crosstable.Добавление «margins = True» в dataframe.loc не работает.

Found                 Exact   Near     No    All
Type        Size                            
X           10          0.0    0.0  100.0  100.0
            100         0.0    0.0  100.0  100.0
            500       100.0    0.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0
Y           10          0.0    0.0  100.0  100.0
            100         0.0  100.0    0.0  100.0
            500         0.0  100.0    0.0  100.0
            1000        0.0  100.0    0.0  100.0
            5000        0.0  100.0    0.0  100.0

Чтобы было немного яснее, зачем мне это нужно, мне нужно резюме всех типов, и в будущем будетбыть больше значений для каждого размера, в пределах типа (так что не все будет больше 100,0%).Может ли кто-нибудь помочь мне организовать эти кадры данных?(Кроме того, я был бы очень рад, если бы «Все» в конце каждой строки было удалено. Кажется, я могу добавить только оба «Все» столбца, даже если мне нужны только столбцы.)

РЕДАКТИРОВАТЬПО ЗАПРОСУ:

фрагмент данных, которые я использовал (я изменил тип на X, Y, Z, в вопросе, но они также отлично работают:

Found   Size    Type
Exact   500     INV
Near    100     DEL
Near    500     DEL
Near    1000    DEL
Near    5000    DEL
Near    100     INS
Near    500     INS
Near    1000    INS
Near    1000    INV
Near    5000    INV
Near    10      DUP
Near    500     DUP
Near    1000    DUP
Near    5000    DUP
No      10      DEL
No      10      INS
No      5000    INS
No      10      INV
No      100     INV
No      100     DUP

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы можете использовать subtotals = df.groupby(level=['Type']).mean() для вычисления промежуточных итогов.Затем

label_order = ['{}{}'.format(pre,label) for label in subtotals.index 
                                        for pre in ['', 'Total_']] + ['All']

создает желаемый порядок меток.Наконец, df = df.loc[label_order] переупорядочивает строки:

import pandas as pd
import numpy as np
nan = np.nan
df = pd.DataFrame({'All': [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, nan], 'Exact': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 65.0], 'Near': [0.0, 100.0, 100.0, 100.0, 100.0, 100.0, 0.0, 100.0, 100.0, 100.0, 30.0], 'No': [100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 100.0], 'Size': [10.0, 100.0, 500.0, 1000.0, 5000.0, 10.0, 100.0, 500.0, 1000.0, 5000.0, 5.0], 'Type': ['X', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y', 'Y', 'All']})

df = df.set_index(['Type','Size'])
df.columns.name = 'Found'

subtotals = df.groupby(level=['Type']).mean()
subtotals = subtotals.loc[subtotals.index != 'All']
label_order = ['{}{}'.format(pre,label) for label in subtotals.index for pre in ['', 'Total_']] + ['All']
subtotals.index = ['Total_{}'.format(label) for label in subtotals.index]
subtotals['Size'] = ''

df = pd.concat([df.reset_index('Size'), subtotals], axis=0, sort=False)
df = df.loc[label_order]
df = df.set_index('Size', append=True)

приводит к

                  All  Exact   Near     No
        Size                              
X       10.0    100.0    0.0    0.0  100.0
        100.0   100.0    0.0  100.0    0.0
        500.0   100.0    0.0  100.0    0.0
        1000.0  100.0    0.0  100.0    0.0
        5000.0  100.0    0.0  100.0    0.0
Total_X         100.0    0.0   80.0   20.0
Y       10.0    100.0    0.0  100.0    0.0
        100.0   100.0    0.0    0.0  100.0
        500.0   100.0    0.0  100.0    0.0
        1000.0  100.0    0.0  100.0    0.0
        5000.0  100.0    0.0  100.0    0.0
Total_Y         100.0    0.0   80.0   20.0
All     5.0       NaN   65.0   30.0  100.0
0 голосов
/ 08 октября 2018

IIUC

appenddf=df.eq(100).sum(level=[0])# get the additional row 


appenddf=appenddf.div(appenddf.All,axis=0).mul(100) # get the percentage by the column count of total count 
appenddf
Out[465]:
      Exact  Near    No    All
Type
X       0.0  80.0  20.0  100.0
Y       0.0  80.0  20.0  100.0

appenddf.index=appenddf.index+'Total'# adjust the index 
appenddf=appenddf.assign(Size=np.nan).set_index('Size',append=True)# adding the Size to the appenddf


pd.concat([df,appenddf]).sort_index(level=0)
Out[484]: 
               Exact   Near     No    All
Type   Size                              
X      10.0      0.0    0.0  100.0  100.0
       100.0     0.0  100.0    0.0  100.0
       500.0     0.0  100.0    0.0  100.0
       1000.0    0.0  100.0    0.0  100.0
       5000.0    0.0  100.0    0.0  100.0
XTotal NaN       0.0   80.0   20.0  100.0
Y      10.0      0.0  100.0    0.0  100.0
       100.0     0.0    0.0  100.0  100.0
       500.0     0.0  100.0    0.0  100.0
       1000.0    0.0  100.0    0.0  100.0
       5000.0    0.0  100.0    0.0  100.0
YTotal NaN       0.0   80.0   20.0  100.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...