промежуточные итоги в pandas для столбцов с использованием сводной таблицы - PullRequest
1 голос
/ 02 апреля 2019

поиск промежуточных итогов по столбцам с использованием сводной таблицы в фреймах данных.

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"], "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"], "C": ["small", "large", "large", "small", "small", "large", "small", "small", "large"], "D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})

print (df)

pd.pivot_table(df, values=['D'], index=['A'], columns=['C', 'B'], aggfunc={'D': np.sum}, margins=True, fill_value=0, margins_name="Total")


following should be the output:

    D                   
C    large    Total    small    Total
B    one  two          one  two 
A                       
bar    4    7    11      5    6    11
foo    4    0     4      1    6     7
Total  8    7    15      6   12    33

1 Ответ

0 голосов
/ 02 апреля 2019

На мой взгляд, лучше добавить новое значение Total для второго уровня MultiIndex для возможной фильтрации по первому уровню.

Для правильного порядка столбцов создайте упорядоченный categorical с Total.

df['B'] = pd.CategoricalIndex(df['B'], 
                              categories= df['B'].unique().tolist() + ['Total'], 
                              ordered=True)

Для совокупного изменения ['D'] на D для предотвращения 3 уровня MultiIndex:

df1 = pd.pivot_table(df, 
                     values='D', 
                     index=['A'], 
                     columns=['C', 'B'], 
                     aggfunc={'D': np.sum}, 
                     fill_value=0)
print (df1)
C   large     small    
B     one two   one two
A                      
bar     4   7     5   6
foo     4   0     1   6

Затем создайте новый DataFrame с промежуточной суммой с sum и MultiIndex.from_product:

df2 = df1.sum(level=0, axis=1)
df2.columns = pd.MultiIndex.from_product([df2.columns, ['Total']])
print (df2)

    large small
    Total Total
A              
bar    11    11
foo     4     7

Затем DataFrame.join вместе и DataFrame.sort_index правильное добавление Total к последним позициям, последнее добавление sum строка:

df = df1.join(df2).sort_index(axis=1)
df.loc['Total'] = df.sum()
print (df)
C     large           small          
B       one two Total   one two Total
A                                    
bar       4   7    11     5   6    11
foo       4   0     4     1   6     7
Total     8   7    15     6  12    18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...