Комбинации Itertool Python Dataframe - PullRequest
       0

Комбинации Itertool Python Dataframe

0 голосов
/ 10 сентября 2018

Почему-то я не мог найти правильное решение для моей проблемы.Я хотел вычислить сумму между столбцом Unit и Scen с равными значениями для той же даты fact_date.Вывод должен выглядеть следующим образом:

Вывод:

Combination Unit_Com    Scen    Value_Sum   Town    Country
11-Apr      a,b         1       28          Town A  USA
11-Apr      a,b         2       31          Town A  USA
11-Apr      a,c         1       30          Town A  USA
11-Apr      a,c         2       30          Town A  USA
11-Apr      a,d         1       31          Town A  USA
11-Apr      a,d         2       29          Town A  USA
11-Apr      b,c         1       32          Town A  USA
11-Apr      b,c         2       39          Town A  USA
11-Apr      b,d         1       33          Town A  USA
11-Apr      b,d         2       38          Town A  USA
11-Apr      c,d         1       35          Town A  USA
11-Apr      c,d         2       37          Town A  USA
10-Apr      a,b         1       28          Town A  USA
10-Apr      a,b         2       25          Town A  USA
10-Apr      a,c         1       32          Town A  USA
10-Apr      a,c         2       26          Town A  USA
10-Apr      a,d         1       38          Town A  USA
10-Apr      a,d         2       22          Town A  USA
10-Apr      b,c         1       24          Town A  USA
10-Apr      b,c         2       27          Town A  USA
10-Apr      b,d         1       30          Town A  USA
10-Apr      b,d         2       23          Town A  USA
10-Apr      c,d         1       34          Town A  USA
10-Apr      c,d         2       24          Town A  USA

, который вычисляется следующим образом:

fact_date: 11-Apr
Town: Town A
Country: USA

Unit: a
Scen(Unit a): 1
Value: 13

Unit: b
Scen(Unit a): 1
Value: 15

**Output (as shown above):**
fact_date: 11-Apr
Unit_Combo: a,b
Scen: 1
Value_Sum: 28
Town: Town A
Country USA

Thisзатем следует выполнить для каждой даты fact_date.

И, наконец, комбинации между Town A and Town B, а также, например, a, e и т. д.

К сожалению, я не получаюлюбая комбинация, и я застрял здесь:

ОБНОВЛЕНИЕ:

Я обновил код, но каким-то образом все еще получаю неправильный вывод

calculating date: 11-Apr
11-Apr 1,1 a,b Town A,Town A USA,USA 28
11-Apr 1,2 a,b Town A,Town A USA,USA 33
11-Apr 1,1 a,c Town A,Town A USA,USA 30
11-Apr 1,2 a,c Town A,Town A USA,USA 32
11-Apr 1,1 a,d Town A,Town A USA,USA 31
11-Apr 1,2 a,d Town A,Town A USA,USA 31
11-Apr 1,1 a,b Town A,Town A USA,USA 23
11-Apr 1,2 a,b Town A,Town A USA,USA 26
11-Apr 1,1 a,c Town A,Town A USA,USA 27
11-Apr 1,2 a,c Town A,Town A USA,USA 27
11-Apr 1,1 a,d Town A,Town A USA,USA 33
11-Apr 1,2 a,d Town A,Town A USA,USA 23
calculating date: 10-Apr
10-Apr 2,1 a,b Town A,Town A USA,USA 26
10-Apr 2,2 a,b Town A,Town A USA,USA 31
10-Apr 2,1 a,c Town A,Town A USA,USA 28
10-Apr 2,2 a,c Town A,Town A USA,USA 30
10-Apr 2,1 a,d Town A,Town A USA,USA 29
10-Apr 2,2 a,d Town A,Town A USA,USA 29
10-Apr 2,1 a,b Town A,Town A USA,USA 21
10-Apr 2,2 a,b Town A,Town A USA,USA 24
10-Apr 2,1 a,c Town A,Town A USA,USA 25
10-Apr 2,2 a,c Town A,Town A USA,USA 25
10-Apr 2,1 a,d Town A,Town A USA,USA 31
10-Apr 2,2 a,d Town A,Town A USA,USA 21

Кодвыглядит следующим образом:

import pandas as pd

df = pd.DataFrame({'fact_date': ['11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','11-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr','10-Apr'],
                   'Unit': ['a','a','b','b','c','c','d','d','a','a','b','b','c','c','d','d','e','e','f','f','g','g','h','h','i','i','j','j','k','k','l','l'],
                   'Town': ['Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town A','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B','Town B'],
                   'Scen': [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2],
                   'Value': [13,11,15,20,17,19,18,18,18,12,10,13,14,14,20,10,18,17,15,19,11,14,14,17,19,10,16,10,16,19,12,11],
                   'Country': ['USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA','USA']})


test_df = pd.DataFrame([])

cluster_names = df['fact_date'].unique()
disjoint_clusters = []
for idx,item in enumerate(cluster_names):
    df[df['fact_date'] == item]

    print('calculating date: ' +str(item))

    for j in range(idx+1, len(df)):
        if df.iloc[idx]['Unit'] != df.iloc[j]['Unit'] and df.iloc[idx]['Town'] == 'Town A' and df.iloc[j]['Town'] == 'Town A':

            print(item,
                  str(df.iloc[idx]['Scen'])+str(',')+str(df.iloc[j]['Scen']), 
                  df.iloc[idx]['Unit']+str(',')+df.iloc[j]['Unit'],
                  df.iloc[idx]['Town']+str(',')+df.iloc[j]['Town'],
                  df.iloc[idx]['Country']+str(',')+df.iloc[j]['Country'],
                  df.iloc[idx]['Value']+df.iloc[j]['Value'])

1 Ответ

0 голосов
/ 11 сентября 2018

Таким образом, этот способ даст вам ожидаемый результат вашего вопроса. Идея состоит в том, чтобы использовать groupby в столбцах 'fact_date','Country','Town','Scen', а затем использовать combinations из itertools в сгруппированном кадре данных для значений в столбцах 'Value','Unit'. Вы можете использовать понимание списка и pd.DataFrame для непосредственного создания результирующего фрейма данных:

from itertools import combinations
df_res = pd.DataFrame([list(name_g) + [val1+val2,'{},{}'.format(unit1,unit2)] 
                       for name_g, df_g in df.groupby(['fact_date','Country','Town','Scen']) 
                       for ((val1, unit1), (val2, unit2)) in combinations(df_g[['Value','Unit']].values,2)],
                      columns=['Combination','Country','Town','Scen','Value_Sum','Unit_Com'])

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

print (df_res[df_res['Town'] == 'Town A'])
   Combination Country    Town  Scen  Value_Sum Unit_Com
0       10-Apr     USA  Town A     1         28      a,b
1       10-Apr     USA  Town A     1         32      a,c
2       10-Apr     USA  Town A     1         38      a,d
3       10-Apr     USA  Town A     1         24      b,c
4       10-Apr     USA  Town A     1         30      b,d
5       10-Apr     USA  Town A     1         34      c,d
6       10-Apr     USA  Town A     2         25      a,b
7       10-Apr     USA  Town A     2         26      a,c
8       10-Apr     USA  Town A     2         22      a,d
9       10-Apr     USA  Town A     2         27      b,c
10      10-Apr     USA  Town A     2         23      b,d
11      10-Apr     USA  Town A     2         24      c,d
24      11-Apr     USA  Town A     1         28      a,b
25      11-Apr     USA  Town A     1         30      a,c
26      11-Apr     USA  Town A     1         31      a,d
27      11-Apr     USA  Town A     1         32      b,c
28      11-Apr     USA  Town A     1         33      b,d
29      11-Apr     USA  Town A     1         35      c,d
30      11-Apr     USA  Town A     2         31      a,b
31      11-Apr     USA  Town A     2         30      a,c
32      11-Apr     USA  Town A     2         29      a,d
33      11-Apr     USA  Town A     2         39      b,c
34      11-Apr     USA  Town A     2         38      b,d
35      11-Apr     USA  Town A     2         37      c,d

РЕДАКТИРОВАТЬ: чтобы сделать то же самое с Town, вы можете сделать это следующим образом:

df_res = pd.DataFrame([list(name_g) + [val1+val2,'{},{}'.format(unit1,unit2), '{},{}'.format(town1,town2)] 
                       for name_g, df_g in df.groupby(['fact_date','Country','Scen']) 
                       for ((val1, unit1, town1), (val2, unit2, town2)) in combinations(df_g[['Value','Unit','Town']].values,2)],
                      columns=['Combination','Country','Scen','Value_Sum','Unit_Com','Town'])

Обратите внимание на разницу в том, что столбец Town уже не в groupby, а в столбцах, выбранных в combinations, и внесены небольшие изменения, чтобы он работал должным образом.

Для случайного выбора этих комбинаций я бы посоветовал взглянуть на функцию sample и, например, если вы хотите 10 из них, вы можете сделать:

print (df_res.sample(n=10))
    Combination Country  Scen  Value_Sum Unit_Com           Town
7        10-Apr     USA     1         24      b,c  Town A,Town A
66       11-Apr     USA     1         30      b,f  Town A,Town B
31       10-Apr     USA     2         22      a,i  Town A,Town B
18       10-Apr     USA     1         39      d,i  Town A,Town B
72       11-Apr     USA     1         28      c,g  Town A,Town B
109      11-Apr     USA     2         33      f,g  Town B,Town B
41       10-Apr     USA     2         24      c,d  Town A,Town A
99       11-Apr     USA     2         38      c,f  Town A,Town B
84       11-Apr     USA     2         31      a,b  Town A,Town A
88       11-Apr     USA     2         30      a,f  Town A,Town B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...