[英]pandas assign value to more than one columns based on a condition using more than 20 columns
下面是一個 SAS 代碼,我正在嘗試將其轉換為 python。 我可以考慮使用 list comprehension
來做到這一點。 或通過使用np.where
使用大的嵌套條件。 但我認為有一種更有效的方法可以實現 output。
pandas 數據框有列day1, day2... day30
和dw1, dw2... dw30
。 條件是查找任何列(例如day2 to day30
中大於 0 的day(x)
,並將'Y'
分配給標志列。如果dw(x-1)
不為 0,則將'Y'
分配給 dwflag。
數據
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
預期 output
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';
這就是我最終能想到的。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.