Я новичок в программировании на Python и ищу способы улучшить свой код.В настоящее время я анализирую фрейм данных, содержащий несколько рабочих процессов.Каждый рабочий процесс имеет различные этапы процесса для инициирования, завершения или удаления инициированного рабочего процесса.В упрощенной версии мои данные выглядят следующим образом:
Workflow Initiate_1 Initiate_2 End_1 End_2 End_3 Del_1 Del_2
0 1 Name_1 na na Name_1 na na na
1 2 Name_2 na na na na Name_2 na
2 3 na Name_3 na na Name_5 na na
3 4 na Name_4 Name_5 na na na na
4 5 na na na na Name_5 na na
Для каждого рабочего процесса я хочу сравнить, отличается ли имя, завершившее рабочий процесс, от имени, инициировавшего рабочий процесс.Кроме того, я хочу определить, был ли инициированный рабочий процесс удален или нет.С помощью Stackoverflow в этом вопросе я написал следующий код и, похоже, дал желаемый результат:
end_scenarios = df.filter(items = ['End_1',
'End_2',
'End_3']) # filter by columns which can end a mutation
delete_scenarios = df.filter(items = ['Del_1',
'Del_2']) # filter by columns which delete a mutation
df = df.replace('na', np.nan)
nulls = end_scenarios.isnull().all(1) # checks which rows are all null
delete = delete_scenarios.notnull().any(1) # checks if a row contains a value in one of the removal scenario's
match = end_scenarios.ffill(1).iloc[:, -1] == df['Initiate_1'] # find last name in the last end
# use np.select to analyse each row for the first initiate scenario
df['Analysis Initiate_1'] = np.select([match, delete, nulls],
['Name end equals initiate', 'Deleted mutation', 'No name ended'],
'Different name ended')
# use np.select to analyse the second initiate scenario
match = end_scenarios.ffill(1).iloc[:, -1] == pivot['Initiate_2']
df['Analysis Initiate_2'] = np.select([match, delete, nulls],
['Name end equals initiate', 'Deleted mutation', 'No name ended'],
'Different name ended')
Я решил переписать анализ, чтобы сравнить несколько столбцов вместо прямого заполненияэто и только сравнить с последним конечным столбцом.На всякий случай, когда в конечных сценариях хранятся несколько имен.Это привело к следующему:
conditions = [
(df['Initiate_1'] != 'na') &
((df['Initiate_1'] == df['End_1']) |
(df['Initiate_1'] == df['End_2']) |
(df['Initiate_1'] == df['End_3']),
(df['Del_1'] != 'na') |
(df['Del_2'] != 'na'),
(df['End_1'] == 'na') &
(df['End_2'] == 'na') &
(df['End_3'] == 'na'))]
answers = ['Name end equals initiate','Deleted','No name ended']
df['Analysis Initiate_1'] = np.select(conditions, answers, default = 'Different name ended')
conditions = [
(df['Initiate_2'] != 'na') &
((df['Initiate_2'] == df['End_1']) |
(df['Initiate_2'] == df['End_2']) |
(df['Initiate_2'] == df['End_3']),
(df['Del_1'] != 'na') |
(df['Del_2'] != 'na'),
(df['End_1'] == 'na') &
(df['End_2'] == 'na') &
(df['End_3'] == 'na'))]
df['Analysis Initiate_2'] = np.select(conditions, answers, default = 'Different name ended')
Код, кажется, дает желаемый результат, но хотел опубликовать код для любых дальнейших улучшений.Есть ли подводные камни в коде, который я написал для сравнения нескольких столбцов?Любые другие способы сделать анализ для нескольких столбцов с более чистым кодом?И т.д.