#python #pandas
#python #pandas
Вопрос:
У меня очень большой фрейм данных, в котором я хочу изменять значения только в небольшом непрерывном подмножестве столбцов. По сути, в этих столбцах значения являются либо целыми числами, либо нулевыми. Все, что я хочу, это заменить 0 и нули на «Нет», а все остальное на «Да» только в этих столбцах
В R это можно сделать в основном с помощью однострочной строки:
df <- df %>%
mutate_at(vars(MCI:BNP), ~factor(case_when(. > 0 ~ 'Yes',
TRUE ~ 'No')))
Но мы работаем на Python, и я не могу точно определить эквивалент, используя Pandas. Я возился с loc и iloc, которые отлично работают при изменении только одного столбца, но я, должно быть, что-то упускаю, когда дело доходит до изменения нескольких столбцов. И ответы, которые я нашел в других ответах stackoverflow, в основном просто меняли значение в одном столбце на основе некоторого набора условий
col1 = df.columns.get_loc("MCI")
col2 = df.columns.get_loc("BNP")
df.iloc[:,col1:col2]
Я получу нужные мне столбцы, но попытка вызвать loc не работает с многомерными ключами. Я даже попробовал использовать столбцы в виде списка, а не по целочисленному индексу, создав дополнительную переменную
binary_var = ['MCI','PVD','CVA','DEMENTIA','CPD','RD','PUD','MLD','DWOC','DWC','HoP','RND','MALIGNANCY','SLD','MST','HIV','AKF',
'ARMD','ASPHY','DEP','DWLK','DRUGA','DUOULC','FALL','FECAL','FLDELEX','FRAIL','GASTRICULC','GASTROULC','GLAU','HYPERKAL',
'HYPTEN','HYPOKAL','HYPOTHYR','HYPOXE','IMMUNOS','ISCHRT','LIPIDMETA','LOSWIGT','LOWBAK','MALNUT','OSTEO','PARKIN',
'PNEUM','RF','SEIZ','SD','TUML','UI','VI','MENTAL','FUROSEMIDE','METOPROLOL','ASPIRIN','OMEPRAZOLE','LISINOPRIL','DIGOXIN',
'ALDOSTERONE_ANTAGONIST','ACE_INHIBITOR','ANGIOTENSIN_RECEPTOR_BLOCKERS','BETA_BLOCKERSDIURETICHoP','BUN','CREATININE',
'SODIUM','POTASSIUM','HEMOGLOBIN','WBC_COUNT','CHLORIDE','ALBUMIN','TROPONIN','BNP']
df.loc[df[binary_var] == 0, binary_var]
Но тогда он просто не может найти индекс для этих имен столбцов вообще. Я думаю, что у Pandas также есть проблемы с преобразованием столбцов, которые изначально были целыми числами, в No / Yes. Мне не нужно делать это на месте, я, вероятно, просто упускаю что-то простое, что, надеюсь, встроил pandas
В описании псевдокода все, что я действительно хочу, это
if(df.iloc[:,col1:col2] == 0 || df.iloc[:,col1:col2].isnull())
df ONLY in that subset of column = 'No'
else
df ONLY in that subset of column = 'Yes'
Ответ №1:
Использование:
df.loc[:, 'MCI':'BNP'] = np.where(df.loc[:, 'MCI':'BNP'] > 0, 'Yes', 'No')