Получение суммы метрик для комбинаций из нескольких столбцов - PullRequest
0 голосов
/ 10 июня 2018

У меня есть фрейм данных pandas, который выглядит следующим образом.

set language    group   version metric_1    metric_2    metric_3
X   English     1       A       100         20          5
X   French      2       A       90          10          10
X   English     1       B       80          30          15
X   French      2       B       70          20          20
Y   English     1       A       200         20          30
Y   French      2       A       180         30          20
Y   English     1       B       160         10          10
Y   French      2       B       140         20          5

Я хочу обобщить метрики со всеми комбинациями атрибутов эксперимента - набор, язык, группа и версия.Таким образом, итоговый фрейм данных будет выглядеть следующим образом.

set language    group   version metric_1    metric_2    metric_3
X                               800         140         80
Y                               1000        140         80
    English                     1200        200         80
    French                      600         80          80
                1               1050        120         60
                2               750         160         100
                        A       850         140         80
                        B       950         140         80
X   English                     500         100         40
X   French                      300         40          40
Y   English                     700         100         40
Y   French                      300         40          40
X               1               350         60          30
X               2               450         80          50
Y               1               700         60          30
Y               2               300         80          50
X                       A       350         70          40
X                       B       450         70          40
Y                       A       500         70          40
Y                       B       500         70          40
    English     1               ...
    English     2               ...
    French      1               ...
    French      2               ...
    English             A       ...
    English             B       ...
    French              A       ...
    French              B       ...
                1       A       ...
                1       B       ...
                2       A       ...
                2       B       ...
X   English     1               ...
X   English     2               ...
X   French      1               ...
X   French      2               ...
Y   English     1               ...
Y   English     2               ...
Y   French      1               ...
Y   French      2               ...
X   English             A       ...
X   English             B       ...
X   French              A       ...
X   French              B       ...
Y   English             A       ...
Y   English             B       ...
Y   French              A       ...
Y   French              B       ...
X               1       A       ...
X               1       B       ...
X               2       A       ...
X               2       B       ...
Y               1       A       ...
Y               1       B       ...
Y               2       A       ...
Y               2       B       ...
    English     1       A       ...
    English     1       B       ...
    English     2       A       ...
    English     2       B       ...
    French      1       A       ...
    French      1       B       ...
    French      2       A       ...
    French      2       B       ...

Я знаю, что могу использовать эту грубую силу с использованием различных комбинаций с группированием и объединением всех из них в один фрейм данных.Это может потенциально распространяться на многие другие атрибуты, поэтому я пытаюсь найти решение, которое будет более масштабируемым.Я читал о функциях, доступных через itertools, но не уверен, как они будут применяться.

Оцените любые идеи / указания по этому вопросу.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вот один из способов сделать это.Я предполагаю, что вы дали только подмножество ваших данных, потому что итоги не складываются:

In []:
import itertools as it

cols = df.columns.tolist()
index = ['set', 'language', 'group', 'version']
df = df.set_index(index)
pd.concat([df.groupby(level=x).sum().reset_index()
           for n in range(1, len(index)+1)
           for x in it.combinations(range(len(index)), n)],
          sort=True)[cols].fillna('')

Out[]:
   set language group version  metric_1  metric_2  metric_3
0    X                              340        80        50
1    Y                              680        80        65
0       English                     540        80        60
1        French                     480        80        55
0                   1               540        80        60
1                   2               480        80        55
0                           A       570        80        65
1                           B       450        80        50
0    X  English                     180        50        20
1    X   French                     160        30        30
2    Y  English                     360        30        40
3    Y   French                     320        50        25
...
0 голосов
/ 11 июня 2018

Действительно, функция combinations из itertools поможет вам создать все возможные комбинации.Предположим, ваши данные находятся в фрейме данных с именем df.

from itertools import combinations
# create two list, one for all columns you want to sum, and the others
list_metric = [col for col in df.columns if 'metric' in col]
list_non_metric = [col for col in df.columns if 'metric' not in col]
# create the dataframe grouped on all columns
df_grouped = df.groupby(list_non_metric,as_index=False)[list_metric].sum() 
# use concat and list comprehension to create all the combinations
df_output = (pd.concat([df_grouped.groupby(list(combi),as_index=False)[list_metric].sum() 
                        for j in range(1, len(list_non_metric)+1) 
                          for combi in combinations(list_non_metric,j) ])
                 .fillna(''))
# reorder the columns as the input data (if necessary)
df_output = df_output[df.columns]

Если вы хотите понять, как работает combinations, попробуйте напечатать эти строки:

[combi for combi in combinations(list_non_metric,2)]

, а затемвторой for j in range(1, len(list_non_metric)+1) поможет создать комбинации из 1, 2, 3, ... элементов list_non_metric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...