Ниже приведен код 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
sjd 22 Мар 2021 в 11:52

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)
0
sjd 22 Мар 2021 в 17:15