Pandas修改JSON导入数据列名时df.rename失效的解决方法
问题根因
df.rename(columns={"data.datasets":"mydata"})执行后列名无变化,核心原因通常是以下两类:
pandas的rename方法默认返回修改后的新DataFrame,不会原地修改原对象,既没有将返回值赋值回原变量、也没加inplace=True参数时,修改不会生效- 列名实际值和你写的映射key不匹配:要么JSON导入后列名带不可见空格/特殊字符,要么嵌套JSON未完全扁平化时列是MultiIndex格式,key为元组而非点分隔字符串
解决步骤
先确认列名真实格式,避免匹配失败
执行以下代码打印列名的原始格式,可识别隐藏空格、多级索引等问题:# 打印所有列的原始表示,可显示不可见的特殊字符/空格 print([repr(col) for col in df.columns])- 如果输出中列名是
'data.datasets'这类字符串格式,用普通字符串映射即可 - 如果输出中列名是
('data', 'datasets')这类元组格式,说明是多级列,映射时key要传入对应元组 - 如果列名前后带空格比如
' data.datasets ',把完整带空格的内容作为映射key即可
- 如果输出中列名是
正确执行重命名操作
两种写法二选一即可:# 写法1:将返回的新DataFrame赋值回原变量 df = df.rename(columns={"data.datasets": "mydata"}) # 写法2:加inplace参数原地修改 df.rename(columns={"data.datasets": "mydata"}, inplace=True)如果是多级列的情况,替换映射key即可:
df = df.rename(columns={("data", "datasets"): "mydata"})附:优化后的完整处理代码(含冗余列清理)
把重命名、删冗余列的步骤放到重采样前执行,逻辑更清晰,同时简化了冗余的日期处理写法:import pandas as pd # 日期列格式转换 df["data.date"] = pd.to_datetime(df["data.date"]) df["date"] = df["data.date"].dt.date df["date"] = pd.to_datetime(df["date"]) # 重命名目标列、删除冗余的旧日期列 df = df.rename(columns={"data.datasets": "mydata"}) df = df.drop(columns=["data.date"]) # 设置索引、按天重采样取每日第一条数据 df = df.set_index('date').resample('d').first() # 筛选2022-05-05到2022-06-05的数据并打印 print(df.loc['2022-05-05':'2022-06-05'])
内容的提问来源于stack exchange,提问作者catlean
相关产品推荐
相关产品推荐

