我有一個看起來像這樣的存在/不存在數據框(它要大得多,但已經減少了這個問題):
annotations factor1 factor2 factor3 Class
heroine 1 0 1 OPIOID_TYPE
he smokes 0 1 0 OTHER_DRUG_USE
heroin 1 0 1 OPIOID_TYPE
我想要做的是為“類”中的每個唯一值創建一個新數據框,並將類中的每個值作為每個數據框的最後一列的名稱插入,並記錄存在/不存在。
換句話說:
annotations factor1 factor2 factor3 OPIOID_TYPE
heroine 1 0 1 1
he smokes 0 1 0 0
heroin 1 0 1 1
和:
annotations factor1 factor2 factor3 OTHER_DRUG_USE
heroine 1 0 1 0
he smokes 0 1 0 1
heroin 1 0 1 0
實際上,我的數據幀要大得多,有 2289 行和 1273 列,“類”中有 23 個唯一值,總共 23 個新數據幀。
我認為循環結構可以在這里工作,但我對 python 循環的經驗有限。
您可以迭代您的Class
值:
dfs = {}
for klass in df['Class'].unique():
dfs[klass] = df.assign(**{klass: df['Class'].eq(klass).astype(int)}) \
.drop(columns='Class')
現在你有一個按Class
值索引的字典:
>>> dfs.keys()
dict_keys(['OPIOID_TYPE', 'OTHER_DRUG_USE'])
>>> dfs['OPIOID_TYPE']
annotations factor1 factor2 factor3 OPIOID_TYPE
0 heroine 1 0 1 1
1 he smokes 0 1 0 0
2 heroin 1 0 1 1
>>> dfs['OTHER_DRUG_USE']
annotations factor1 factor2 factor3 OTHER_DRUG_USE
0 heroine 1 0 1 0
1 he smokes 0 1 0 1
2 heroin 1 0 1 0
現在如果你真的想要真正的 python 變量,你可以使用locals()
動態創建它們:
for idx, klass in enumerate(df['Class'].unique(), 1):
print(f"df{idx} is for '{klass}' class")
locals()[f"df{idx}"] = df.assign(**{klass: df['Class'].eq(klass).astype(int)}) \
.drop(columns='Class')
# Output:
df1 is for 'OPIOID_TYPE' class
df2 is for 'OTHER_DRUG_USE' class
輸出:
>>> df1
annotations factor1 factor2 factor3 OPIOID_TYPE
0 heroine 1 0 1 1
1 he smokes 0 1 0 0
2 heroin 1 0 1 1
>>> df2
annotations factor1 factor2 factor3 OTHER_DRUG_USE
0 heroine 1 0 1 0
1 he smokes 0 1 0 1
2 heroin 1 0 1 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句