У меня есть следующий скрипт:
import pandas as pd
ls = [
['A', 1, 'A1', 9],
['A', 1, 'A1', 6],
['A', 1, 'A1', 3],
['A', 2, 'A2', 7],
['A', 3, 'A3', 9],
['B', 1, 'B1', 7],
['B', 1, 'B1', 3],
['B', 2, 'B2', 7],
['B', 2, 'B2', 8],
['C', 1, 'C1', 9],
]
#convert to dataframe
df = pd.DataFrame(ls, columns = ["Main_Group", "Sub_Group", "Concat_GRP_Name", "X_1"])
#get count and sum of concatenated groups
df_sum = df.groupby('Concat_GRP_Name')['X_1'].agg(['sum','count']).reset_index()
#print in permutations formula to calculate different permutation combos
import itertools as it
perms = it.permutations(df_sum.Concat_GRP_Name)
def combute_combinations(df, colname):
l = []
import itertools as it
perms = it.permutations(df[colname])
for perm_pairs in perms:
#take in only the first three pairs of permuations and make sure
#the first column starts with A, secon with B, and third with C
if 'A' in perm_pairs[0] and 'B' in perm_pairs[1] and 'C' in perm_pairs[2]:
l.append([perm_pairs[0], perm_pairs[1], perm_pairs[2]])
return l
#apply function, this will generate a list of all of the permuation pairs
t = combute_combinations(df_sum, 'Concat_GRP_Name' )
#convert to dataframe and drop duplicate pairs
df2 = pd.DataFrame(t, columns = ["Item1", 'Item2', 'Item3']) .drop_duplicates()
Я не знаю, как объединить компоненты цикла внутри оператора IF. Из приведенного выше примера я знал, что у меня есть три разных типа переменной Main_Group. Допустим, я не знал, сколько уникальных значений существует в столбце Main_Group. Как мне обновить следующий оператор IF, чтобы учесть это?
if 'A' in perm_pairs[0] and 'B' in perm_pairs[1] and 'C' in perm_pairs[2]:
l.append([perm_pairs[0], perm_pairs[1], perm_pairs[2]])
Я хочу, чтобы каждая переменная находилась в своем столбце. Если у меня есть 5 типов основной группы, то в моем выражении IF у меня будет perm_pairs[0] to perm_pairs[4]. Я думал об извлечении значений из Main_Group и превращении их в набор. Затем я перебираю каждое значение и использую его длину, чтобы выяснить оператор IF, но пока логика не работает. Как выполнить итерацию по набору, а затем обновить оператор IF?
Значения могут быть разными. Столбец может содержать «A, B, C, D» или «шоколад, пудинг, слон, панда, лев, фильм». Содержание и длина могут варьироваться, но мне нужны разные комбинации подгрупп этих элементов для каждого столбец, созданный группой Main_Key.Если есть n уникальных элементов Main_Group, проверка выполняется для каждого элемента и импортируется в n уникальных столбцов.
Я не уверен, как это сработает, но list('ABC') == perm_pairs[0:3]
может помочь. Вы можете использовать срез, чтобы получить подсписок, а затем сравнить его со списком значений. Очевидно, что вы не стали бы жестко кодировать 0:3
, поэтому длина среза зависит от данных.
@NChauhan нет, это не сработало
Я не уверен, что смогу помочь вам в этом. Извиняюсь! Единственный способ изменить количество проверок в операторе if — это срез списка или all()
.
@NChauhan спасибо за попытку :)
Чтобы сделать условие более динамичным, вы можете реорганизовать свою функцию следующим образом:
import numpy as np
def combute_combinations(df, colname, main_group_series):
l = []
import itertools as it
perms = it.permutations(df[colname])
# Provides sorted list of unique values in the Series
unique_groups = np.unique(main_group_series)
for perm_pairs in perms:
#take in only the first three pairs of permuations and make sure
#the first column starts with A, secon with B, and third with C
if all([main_group in perm_pairs[ind] for ind, main_group in enumerate(unique_groups)]):
l.append([perm_pairs[ind] for ind in range(unique_groups.shape[0])])
return l
Затем вы можете просто вызвать функцию, как и раньше, но включить серию столбца основной группы
t = combute_combinations(df_sum, 'Concat_GRP_Name', df['Main_Group'])
Это не дает такой же результат, как моя функция выше.
Извините, вы правы. Я предполагал некоторые вещи, не проверяя их, мой плохой :) Теперь все должно быть в порядке.
По каким значениям вы проверяете элементы? Всегда ли это «А», «В», «С» и т. д.?