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

拆分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:48:15