Оператор IF зависит от цикла

У меня есть следующий скрипт:

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?

По каким значениям вы проверяете элементы? Всегда ли это «А», «В», «С» и т. д.?

N Chauhan 31.05.2019 00:03

Значения могут быть разными. Столбец может содержать «A, B, C, D» или «шоколад, пудинг, слон, панда, лев, фильм». Содержание и длина могут варьироваться, но мне нужны разные комбинации подгрупп этих элементов для каждого столбец, созданный группой Main_Key.Если есть n уникальных элементов Main_Group, проверка выполняется для каждого элемента и импортируется в n уникальных столбцов.

Maria Nazari 31.05.2019 00:05

Я не уверен, как это сработает, но list('ABC') == perm_pairs[0:3] может помочь. Вы можете использовать срез, чтобы получить подсписок, а затем сравнить его со списком значений. Очевидно, что вы не стали бы жестко кодировать 0:3, поэтому длина среза зависит от данных.

N Chauhan 31.05.2019 00:10

@NChauhan нет, это не сработало

Maria Nazari 31.05.2019 00:21

Я не уверен, что смогу помочь вам в этом. Извиняюсь! Единственный способ изменить количество проверок в операторе if — это срез списка или all().

N Chauhan 31.05.2019 00:25

@NChauhan спасибо за попытку :)

Maria Nazari 31.05.2019 00:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сделать условие более динамичным, вы можете реорганизовать свою функцию следующим образом:

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'])

Это не дает такой же результат, как моя функция выше.

Maria Nazari 31.05.2019 02:01

Извините, вы правы. Я предполагал некоторые вещи, не проверяя их, мой плохой :) Теперь все должно быть в порядке.

Richard Nemeth 31.05.2019 02:27

Другие вопросы по теме