У меня есть файл Excel, в котором я использую каждый столбцы как DataFrame. Вот 5 DataFrames, которые я использую - (я буду добавлять столбец номера строки для более легкого разъяснения в моем вопросе. Он не включен в исходный файл):
row_no svc_no i_status caller_id f_status remarks
1 11111 WO 22222 WO
2 22222 WO 11111 WO
3 33333 WO n/a FA
4 NULL FA 33333 WO
5 444444 WO 55555 WO
6 55555 WO new_num WO
Мне нужно поставить значение в колонке remarks
после того, как я удовлетворю условиям. В этом случае есть три сценария, в которых каждый сценарий имеет разные условия.
Примечание. Строки данных могут отличаться, но для моего примера я помещаю их последовательно
Условия сценария 1 (строки 1 и 2):
svc_no
не равно caller_id
svc_no
не является NULLcaller_id
не является n/asvc_no
находится в caller_id
и наоборотi_status
и f_status
- WOУсловия сценария 2 (строки 3 и 4):
svc_no
не равно caller_id
svc_no
находится в caller_id
и наоборотsvc_no
сопоставляется с n/a, а значение его пары в caller_id
сопоставляется с NULLi_status
и f_status
- FA, если значение NULL или n/aСценарий 3 условия (строки 5 и 6):
svc_no
не равно caller_id
svc_no
- 6 числовых символовcaller_id
- new_numi_status
и f_status
- WOsvc_no
находится в caller_id
и наоборотТеперь позвольте сказать, что я удовлетворяю условиям для каждого сценария, я должен будет указать обозначенное значение в примечаниях. Поэтому мой желаемый результат:
row_no svc_no i_status caller_id f_status remarks
1 11111 WO 22222 WO S1 Transpose
2 22222 WO 11111 WO S1 Transpose
3 33333 WO n/a FA S2 Transpose
4 NULL FA 33333 WO S2 Transpose
5 444444 WO 55555 WO S3 Transpose
6 55555 WO new_num WO S3 Transpose
Моя проблема в том, что хотя мой код работает и следит за условиями, результат не является точным. Вот мой код:
# Scenario 1
df.loc[(df['svc_no'] != df['caller_id']) &
(df['svc_no'].isin(df['caller_id'])) &
(df['caller_id'].isin(df['svc_no'])) &
(df['svc_no'] != 'NULL') &
(df['caller_id'] != 'n/a') &
(df['i_status'] == 'WO') &
(df['f_status'] == 'WO'), ['remarks']] = 'S1 Transpose'
# Scenario 2
# NULL svc_no
df.loc[(df['svc_no'] == 'NULL') &
(df['caller_id'] !='n/a') &
(df['svc_no'].isin(df['caller_id'])) &
(df['caller_id'].isin(df['svc_no'])) &
(df['i_status'] == 'FA') &
(df['f_status'] == 'WO')['remarks']] = 'S2 Transpose'
# n/a in caller_id
df.loc[(df['svc_no'] != 'NULL') &
(df['caller_id'] =='n/a') &
(df['svc_no'].isin(df['caller_id'])) &
(df['caller_id'].isin(df['svc_no'])) &
(df['i_status'] == 'WO') &
(df['f_status'] == 'FA')['remarks']] = 'S2 Transpose'
# Scenario 3
df.loc[(c_merge['svc_no'] != 'NULL') &
(df['svc_no'].isin(c_merge['caller_id'])) &
(df['caller_id'].isin(c_merge['svc_no'])) &
(df['i_status'] == 'WO') &
(df['caller_id'] != c_merge['svc_no']) &
(df['f_status'] == 'WO') &
(df['caller_id'] == 'new_num', ['remarks']] = s3_wo_wo
Результат, который у меня есть:
row_no svc_no i_status caller_id f_status remarks
1 11111 WO 22222 WO S1 Transpose
2 22222 WO 11111 WO S1 Transpose
3 33333 WO n/a FA S1 Transpose
4 NULL FA 33333 WO S1 Transpose
5 444444 WO 55555 WO
6 55555 WO new_num WO S3 Transpose
S1 Transpose
также вводит данные в S2 Transpose
и S3 Transpose only
помещает ввод S3 Transpose only
в один ряд.
Есть ли способ, которым я могу группировать 2 строки, которые применяют условия? Или есть способ для моего кода, в котором они будут применяться к конкретным затронутым этим строкам?
Я ответил на это, выполнив: я использовал df.loc для каждой следующей строки.
Я смог получить свой результат без группировки двух строк, содержащих транспонированное значение.
В строке (df['svc_no']isint(df['caller_id']))
, я обнаруживаю, существует ли значение в svc_no
в caller_id
и создается другой df.loc для другой другой строки
Сценарий 1:
df.loc[(c_merge['svc_no'] != 'NULL') & /
(df['i_status'] == 'WO') & /
(df['caller_id'] != 'n/a') & /
(df['f_status'] == 'WO') & /
(df['svc_no'] != df['caller_id']) & /
(df['svc_no'].isin(df['caller_id'])), ['remarks']] = 'S1 Transpose'
df.loc[(c_merge['svc_no'] != 'NULL') & /
(df['i_status'] == 'WO') & /
(df['caller_id'] != 'n/a') & /
(df['f_status'] == 'WO') & /
(df['svc_no'] != df['caller_id']) & /
(df['caller_id'].isin(df['svc_no'])), ['remarks']] = 'S1 Transpose'
Я применил бы это к другим сценариям, поскольку я думаю, что это путь к нему.