Python GUI修改数据后更新CSV文件的实现疑问
问题:将GUI修改的数据更新到CSV文件
作为Python编程新手,现有一个从CSV读取数据并展示的GUI,updatetext函数可正常加载数据。现在需要实现修改GUI中的数据后更新CSV文件,已编写onClickedSaveReturn函数构建了字典df_subj,老板补充了读取CSV为DataFrame、定位待替换行索引的代码,但不知道如何将字典df_subj转为DataFrame并替换df对应索引行的操作,寻求帮助。
展示数据的函数
def updatetext(self): """adds information extracted from database already provided""" df_subj = Content.extract_saved_data(self.date) self.lineEditFirstDiagnosed.setText(str(df_subj["First_Diagnosed_preop"][0])) \ if str(df_subj["First_Diagnosed_preop"][0]) != 'nan' else self.lineEditFirstDiagnosed.setText('') self.lineEditAdmNeurIndCheck.setText(str(df_subj['Admission_preop'][0])) \
保存数据的初始代码
def onClickedSaveReturn(self): """closes GUI and returns to calling (main) GUI""" df_general = Clean.get_GeneralData() df_subj = {k: '' for k in Content.extract_saved_data(self.date).keys()} # extract empty dictionary df_subj['ID'] = General.read_current_subj().id[0] df_subj['PID'] = df_general['PID_ORBIS'][0] df_subj['Gender'] = df_general['Gender'][0] df_subj['Diagnosis_preop'] = df_general['diagnosis'][0] df_subj["First_Diagnosed_preop"] = self.lineEditFirstDiagnosed.text() df_subj['Admission_preop'] = self.lineEditAdmNeurIndCheck.text() df_subj['Dismissal_preop'] = self.DismNeurIndCheckLabel.text()
老板补充的代码
subj_id = General.read_current_subj().id[0] # reads data from curent_subj (saved in ./tmp) df = General.import_dataframe('{}.csv'.format(self.date), separator_csv=',') if df.shape[1] == 1: df = General.import_dataframe('{}.csv'.format(self.date), separator_csv=';') idx2replace = df.index[df['ID'] == subj_id][0] # TODO: you need to find a way to turn the dictionaryy df_subj into a dataframe and replace the data at # the index idxreplace of 'df' with df_subj. Later I would suggest to use line 322 to save everything to the # file df.iloc[idx2replace] = pds.DataFrame([df_subj]) df.to_csv("preoperative.csv", index=False) # df.to_csv(os.path.join(FILEDIR, "preoperative.csv"), index=False) self.close()
解决方案
老板写的df.iloc[idx2replace] = pds.DataFrame([df_subj])存在问题:df.iloc[idx2replace]是单行的Series(一维数据),而pds.DataFrame([df_subj])是二维的DataFrame,直接赋值会报错。可以用以下两种方法修正:
方法1:将字典转为Series直接赋值(推荐)
这种方式会自动匹配字典的键和DataFrame的列名,确保数据对应正确:
# 替换老板写的错误代码 df.iloc[idx2replace] = pds.Series(df_subj)
方法2:转成DataFrame后取单行赋值
如果一定要先转成DataFrame,需要取出其中的单行数据(转为Series类型)再赋值:
# 先将字典转为单行DataFrame,再取出第一行 df_subj_df = pds.DataFrame([df_subj]) df.iloc[idx2replace] = df_subj_df.iloc[0]
注意事项
- 确保
df_subj的所有键名和df的列名完全一致,否则会出现数据不匹配或缺失值。 - 保持pandas导入的一致性,老板代码中用的是
pds作为别名,不要随意改成pd,避免导入错误。
内容的提问来源于stack exchange,提问作者Marco Rothermel
相关产品推荐
相关产品推荐

