拆分DataFrame后如何更新主数据?问答游戏日期更新问题
问答游戏DataFrame同步更新问题解决方案
问题场景
开发问答游戏时,从主DataFrame(studydata)提取当日问题展示给用户,期望用户答对后直接更新主DataFrame中对应问题的日期(延后一天),但当前拆分出的子DataFrame是原数据的副本,修改副本无法同步到主DataFrame。
核心原因
questions = pds.DataFrame(studydata.loc[...])创建的是原DataFrame的副本,而非视图,对副本的修改不会影响原数据;同时原代码中通过位置索引修改字段的逻辑也不符合需求。
解决方案
遍历当日问题时,保留原DataFrame的索引,直接通过索引定位主DataFrame的行进行修改,避免创建独立副本。
修改后的代码
import pandas as pds import datetime as dt from os import system def main_body(): global studydata input_value_variable = input("Enter command (w/write for add question, q/questions for start quiz): ") if input_value_variable in ['write', 'w']: system('cls') # 添加新问题到主DataFrame new_row = { 'Date': dt.date.today(), 'Name': input('Please input the question of the item: '), 'Description': input('Please input the description of the item: '), 'Category': 1 } studydata = pds.concat([studydata, pds.DataFrame([new_row])], ignore_index=True) main_body() if input_value_variable in ['q', 'questions']: system('cls') # 筛选当日问题,保留原索引 today_date = dt.date.today() today_questions = studydata[studydata['Date'] == today_date] # 遍历当日问题,同时获取原DataFrame的索引 for idx, row in today_questions.iterrows(): input(f''' Answer the question below: {row['Name']}? ----------------------------------------------- ''') response = input(''' Was your answer correct/close? ( y - yes | n - no | ea - edit) ----------------------------------------------- ''') if response in ['yes', 'y']: # 直接更新主DataFrame中对应行的日期,延后一天 studydata.at[idx, 'Date'] = today_date + dt.timedelta(days=1) main_body() # 初始化主DataFrame studydata = pds.DataFrame(columns=['Date', 'Name', 'Description', 'Category']) main_body()
关键优化点
- 用
iterrows()遍历当日问题,同时拿到原DataFrame的索引idx,直接通过studydata.at[idx, 'Date']修改原数据 - 避免创建子DataFrame副本,直接基于原DataFrame的筛选结果操作,确保修改同步生效
- 用列名
row['Name']替代位置索引[1],代码可读性和稳定性更高 - 使用
dt.timedelta(days=1)处理日期延后,避免手动字符串拼接的错误
内容的提问来源于stack exchange,提问作者user19564905
相关产品推荐
相关产品推荐

