Я выполняю исчерпывающий поиск по комбинациям столбцов в Pandas df.Нет целевой функции и, следовательно, нет оптимизации.Просто исчерпывающая серия фильтров df.
У меня есть набор стандартизированных файлов.Для каждого я строю df, структурированный как:
Клиент 'A', 'B', 'C', ... 'K', 'Metric1', 'Metric2', 'Metric3'
Столбцы AK - это функции, по которым я хочу отфильтровать df.Используя itertools, я создаю все уникальные комбинации из 5 из этих столбцов.
Столбцы 'Metric1' - 'Metric3' содержат другие значения, для которых я хочу вычислить средние значения после фильтрации df.
У df есть индекс 'Customer'.
# Features
featureList = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
numInputs = 5
# Build a list of unique parameter combinations (list of tuples)
AllParms = []
AllParms = list(itertools.combinations(featureList, numInputs))
# Create a list of integers to identify the iteration, i1, i2, i3, etc.
iteration = list(range(1, len(AllParms) + 1))
# Loop thru files
for file in filenames:
# Read data file.
df = pd.read_csv(file, index_col='Customer', header=0)
# Loop thru parameter sets
for j in range(len(AllParms)):
'''
Get a unique parameter set (an element from the list of tuples).
Parse tuple into variables to create df booleans
Get parms from 'AllParms' and iteration number from 'iteration'
'''
parmToIterate = AllParms[j]
parmn = 'i' + str(iteration[j])
parmA = parmToIterate[0]
parmB = parmToIterate[1]
parmC = parmToIterate[2]
parmD = parmToIterate[3]
parmE = parmToIterate[4]
concatStr = parmA + '_' + parmB + '_' + parmC + '_' + parmD + '_' + parmE
''' Filter df '''
# Method 1
df[parmn] = (
(df[parmA] > 0) &
(df[parmB] > 0) &
(df[parmC] > 0) &
(df[parmD] > 0) &
(df[parmE] > 0)).astype(str)
df2 = df.loc[df[parmn].isin(['True'])]
# Method 2
Cond1 = df[parmA] > 0
Cond2 = df[parmB] > 0
Cond3 = df[parmC] > 0
Cond4 = df[parmD] > 0
Cond5 = df[parmE] > 0
AllCond = Cond1 & Cond2 & Cond3 & Cond4 & Cond5
df2 = df[AllCond]
''' Calc Metrics for Filtered Rows'''
Metric1_mean = round(df2['Metric1'].mean(),3)
Metric2_mean = round(df2['Metric2'].mean(),3)
Metric3_mean = round(df2['Metric3'].mean(),3)
''' Join metrics for all parm sets and unique parm string '''
Вопросы:
Приведенный выше код работает нормально, но я прочитал много негативных комментариев о динамическом создании столбцов df,Что не так с созданием df [элемент из списка или кортежа] = что-то?Что может быть альтернативой при циклической обработке наборов столбцов?
Метод 2 в 6,7 раза быстрее, чем метод 1. Я понимаю, что метод 1 является чисто строковой операцией, но не является методом 2а?