Python Pandas中df.loc[0]指向第二行而非首行的问题排查
问题原因
- CSV读取参数默认值导致行索引错位
pd.read_csv默认参数header=0,会把CSV文件的第一行内容识别为DataFrame的列名,不会纳入数据行范围。所以你代码中df.loc[0]对应的是原文件的第二行内容,你想要修改的第一行已经被存为df.columns,不在数据行中,自然无法通过修改数据行的方式更新。
- CSV读取参数默认值导致行索引错位
- 链式索引存在赋值失效风险
你使用的df.loc[0][get_date()] = xxx属于链式索引操作,Pandas无法确定你修改的是原DataFrame还是临时生成的副本,大概率会触发SettingWithCopyWarning,修改不会生效到原数据。
- 链式索引存在赋值失效风险
修复方案
- 读取模板CSV时关闭自动识别表头,修改读取代码为:
df = pd.read_csv("reg format.csv", header=None)
该配置会将CSV的所有行都作为数据行读取,此时df.loc[0]就对应原文件的第一行内容。如果需要自定义列名(比如第一列是老师名称,后续列是1~31号日期),可以在读取后手动设置:
df.columns = ["teacher_name"] + [str(i) for i in range(1, 32)]
- 替换所有链式索引为安全的loc赋值写法,同时指定行和列:
原来的写法:
def update_day(df): df.loc[0][get_date()] = get_day()
修改为:
def update_day(df): df.loc[0, str(get_date())] = get_day()
同理修改其他函数中的链式赋值操作,比如update_date函数改为:
def update_date(df): df.loc[1, str(get_date())] = get_date()
- 补充修复代码中的语法和逻辑问题
update_sunday函数中存在get_date+1()的语法错误,且replace规则重复无效,修改为:
def update_sunday(df): if get_day().lower() == "saturday": next_day = str(int(get_date())+1) df[next_day].replace({"0": "3"}, inplace=True) df.loc[0, next_day] = "Sunday"
内容的提问来源于stack exchange,提问作者S.Uzair
相关产品推荐
相关产品推荐

