如何用Pandas将长格式DataFrame转换为带双层表头的宽格式
解决方案:用Pandas生成双层表头的宽格式数据
没问题,这个需求用Pandas的内置方法就能轻松实现,我给你详细的步骤和代码:
完整代码示例
import pandas as pd # 读取你的CSV文件(替换成实际文件路径) df = pd.read_csv('your_data.csv') # 转换为宽格式,生成多层列索引 df_wide = df.pivot( index='date_time', columns='country', values=['temp', 'dc'] ) # 调整列层级顺序:把「国家」放在第一层,「属性(temp/dc)」放在第二层 df_wide = df_wide.swaplevel(axis=1).sort_index(axis=1) # 可选:查看转换后的结果 print(df_wide.head())
代码分步解释
- 读取原始数据:用
pd.read_csv加载你的CSV文件,记得把your_data.csv替换成实际的文件路径。 - 生成基础宽格式:
pivot是实现转换的核心方法——我们指定date_time作为行索引,country作为列的分组维度,temp和dc作为要展开的属性字段。这一步会生成带多层列索引的DataFrame,但默认的层级顺序是「属性在前,国家在后」。 - 调整列层级结构:用
swaplevel(axis=1)交换列的两个层级,再用sort_index(axis=1)把同一国家的列归拢到一起,最终就得到了你想要的「国家为第一层表头,temp/dc为第二层表头」的结构。
处理重复数据的特殊情况
如果你的CSV里存在同一date_time+country的重复记录(比如同一时间同一国家有多条temp/dc数据),可以用pivot_table替代pivot,并指定聚合函数来处理重复值:
df_wide = df.pivot_table( index='date_time', columns='country', values=['temp', 'dc'], aggfunc='first' # 取第一条记录,也可以用'mean'取平均值、'max'取最大值等 ) df_wide = df_wide.swaplevel(axis=1).sort_index(axis=1)
转换后的结果完全匹配你想要的结构:date_time作为行索引,外层表头是各个国家,内层表头对应temp和dc属性。
内容的提问来源于stack exchange,提问作者khuesmann
相关产品推荐
相关产品推荐

