Мысли о коде Python для сравнения нескольких столбцов в кадре данных - PullRequest
0 голосов
/ 10 февраля 2019

Я новичок в программировании на 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')

Код, кажется, дает желаемый результат, но хотел опубликовать код для любых дальнейших улучшений.Есть ли подводные камни в коде, который я написал для сравнения нескольких столбцов?Любые другие способы сделать анализ для нескольких столбцов с более чистым кодом?И т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...