You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:25:15