Ниже приведен код SAS, который я пытаюсь преобразовать в Python. Я мог бы подумать об этом с помощью списка comprehension
. или используя большое вложенное условие с помощью np.where
. Но я думаю, что есть более эффективный способ добиться результата.
Фрейм данных pandas имеет столбцы day1, day2 ... day30
и dw1, dw2... dw30
. Условие состоит в том, чтобы найти любой столбец (скажем, day(x)
больше 0 в day2 to day30
и назначить 'Y'
для флагового столбца. И назначить 'Y'
для dwflag, если dw(x-1)
не 0.
Данные
day1 day2 day3 day4 dw1 dw2 dw3 dw4
1 1 0 1 0 0 0 0
1 0 1 1 1 0 0 0
1 1 1 0 0 0 0 0
1 1 1 0 0 0 1 0
1 1 1 1 0 0 0 0
Ожидаемый результат
day1 day2 day3 day4 dw1 dw2 dw3 dw4 dflag dwflag
1 1 0 1 0 0 0 0 Y N
1 0 1 1 1 0 0 0 Y Y
1 1 1 0 0 0 0 0 Y N
1 1 1 0 0 0 1 0 Y Y
1 1 1 1 0 0 0 0 N N
Код SAS
dflag= 'N';
DO I = 2 TO 30 WHILE(dflag='N');
IF day(I) = 0 THEN
DO;
dflag='Y';
IF dw(I-1) NE 0 THEN
dwflag = 'Y';
END;
END;
IF dwflag NE 'Y' THEN dwflag='N';
1 ответ
Это то, что я наконец смог придумать.
day_cols = [f'day{i}' for i in range(2,31)]
df['days_min_value'] = df[day_cols].min(axis=1)
df['dw_colname'] = df[day_cols].idxmin(axis=1).str.extract('(\d+)').astype(int)-1
df['dw_colname'] = 'dw'+df['dw_colname'].astype(str)
df['dflag'] = np.where(df['days_min_value'] == 0, 'Y', 'N')
df['dwflag'] = np.where( (df['dflag'] == 'Y') & (df[df['dw_colname']] != 0), 'Y', 'N')
df.drop(['days_min_value', 'dw_colname'], inplace=True)
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.