[英]Replacing values in multiple columns with Pandas based on conditions
我有一個非常大的 dataframe ,我只想更改一小部分連續列中的值。 基本上,在這些列中,值要么是整數,要么是 null。 我只想在那些列中用“否”替換 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 不適用於多維鍵。 我什至通過創建一個額外的變量來嘗試將列作為列表而不是 integer 索引
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 在將最初是整數的列轉換為否/是時也存在問題。 我不需要這樣做,我可能只是錯過了 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'
利用:
df.loc[:, 'MCI':'BNP'] = np.where(df.loc[:, 'MCI':'BNP'] > 0, 'Yes', 'No')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.