Как сохранить результаты итерации по строкам Pandas DataFrame в новом столбце? - PullRequest
0 голосов
/ 31 декабря 2018

Я новичок в кодировании на Python.В настоящее время я пытаюсь проанализировать фрейм данных, содержащий несколько рабочих процессов.Каждый рабочий процесс имеет различные этапы процесса для запуска и завершения рабочего процесса.В упрощенной версии мои данные выглядят следующим образом:

   Workflow Initiate   End_1   End_2   End_3
0         1   Name_1      na  Name_1      na
1         2   Name_2      na      na      na
2         3   Name_3      na      na  Name_5
3         4   Name_4  Name_5      na      na
4         5       na      na      na  Name_5

Для каждого рабочего процесса я хочу сравнить, отличается ли имя, завершившее рабочий процесс, от имени, инициировавшего рабочий процесс.

Итерация по строкам следующим образом дает желаемый результат:

for index, row in df.iterrows():
    if ((row['Initiate'] != 'na')
        and (row['Initiate'] == row['End_1']) |
            (row['Initiate'] == row['End_2']) |
            (row['Initiate'] == row['End_3'])
        ):
        print("Name end equals initiate")
    elif ((row['End_1'] == 'na') &
          (row['End_2'] == 'na') &
          (row['End_3'] == 'na')
         ):
        print("No name ended")
    else:
        print("Different name ended")

Name end equals initiate
No name ended
Different name ended
Different name ended
Different name ended

Однако я хочу добавить дополнительный столбец, скажем, «Анализ», в кадре данных, который показываетвыше результат за каждым рабочим процессом.

Для этого я вставил код в функцию:

def function_name(a, b, c, d):
    for index, row in df.iterrows():
        if ((a != 'na')
            and (a == b) |
                (a == c) |
                (a == d)
            ):
            return "Name end equals initiate"
        elif ((b == 'na') &
              (c == 'na') &
              (d == 'na')
             ):
            return "No name ended"
        else:
            return "Different name ended"

df['Analysis'] = function_name(row['Initiate'],
                               row['End_1'],
                               row['End_2'],
                               row['End_3'])

print(df)

   Workflow Initiate          ...            End_3              Analysis
0         1   Name_1          ...               na  Different name ended
1         2   Name_2          ...               na  Different name ended
2         3   Name_3          ...           Name_5  Different name ended
3         4   Name_4          ...               na  Different name ended
4         5       na          ...           Name_5  Different name ended

Как видите, результат отличается от первого анализа.Я хотел бы добавить дополнительный столбец к моему фрейму данных, который дает мне тот же вывод, что и с операторами print.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Попробуйте использовать np.select ()

conditions = [
    (df['Initiate'] != 'na') & ((df['Initiate'] == df['End_1']) | (df['Initiate'] == df['End_2']) | (df['Initiate'] == df['End_3'])),
    (df['End_1'] == 'na') & (df['End_2'] == 'na') & (df['End_3'] == 'na')
] 

answers = ['Name end equals initiate','No name ended']   
df['Analysis'] = np.select(conditions, answers, default='Different name ended')
0 голосов
/ 31 декабря 2018

Здесь следует избегать построчных петель.Ваш алгоритм векторизован:

df = df.replace('na', np.nan)  # replace string 'na' with NaN for efficient processing
ends = df.filter(like='End')  # filter by columns with 'End'

match = ends.ffill(1).iloc[:, -1] == df['Initiate']  # find last Name in each End
nulls = ends.isnull().all(1)  # check which rows are all null

# apply vectorised conditional logic
df['Result'] = np.select([match, nulls], ['Name end equals initiate', 'No name ended'],
                         'Different name ended')

print(df)

   Workflow Initiate   End_1   End_2   End_3                    Result
0         1   Name_1     NaN  Name_1     NaN  Name end equals initiate
1         2   Name_2     NaN     NaN     NaN             No name ended
2         3   Name_3     NaN     NaN  Name_5      Different name ended
3         4   Name_4  Name_5     NaN     NaN      Different name ended
4         5      NaN     NaN     NaN  Name_5      Different name ended
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...