如何转换DataFrame结构:以岛屿为行索引,月份+年份为列名
解决方案
可以通过转置DataFrame、调整索引层级、拼接时间标签这几个步骤实现需求,具体代码如下:
# 先将带逗号的字符串数值转为浮点型 df = df.replace(',', '', regex=True).astype(float) # 转置DataFrame,交换行与列的层级 df_transposed = df.T.swaplevel(0, 1).sort_index() # 拼接月份与年份作为列名,同时设置岛屿为行索引 result = df_transposed.T.set_index(df_transposed.columns.get_level_values(0)) result.columns = result.columns.get_level_values(1) + result.columns.get_level_values(0) # 调整列的顺序(按月份从JAN到DEC,年份从2022到2023) month_order = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'] year_order = ['2022', '2023'] sorted_columns = [f"{m}{y}" for y in year_order for m in month_order] result = result[sorted_columns]
代码说明
- 数值格式转换:原DataFrame中的值是带千分位逗号的字符串,先去掉逗号并转为浮点型,确保后续操作正常。
- 转置与层级交换:通过
T转置后,用swaplevel交换列的层级(把年份和岛屿的层级调换),再排序索引让同一年份的月份集中。 - 拼接列名:提取月份和年份的索引值,拼接成
JAN2022这类格式作为新列名,同时将岛屿设置为行索引。 - 列排序:按照月份和年份的顺序重新排列列,保证列顺序符合从2022年1月到2023年12月的逻辑。
最终结果示例
执行后得到的result结构如下:
JAN2022 FEB2022 MAR2022 APR2022 MAY2022 JUN2022 JUL2022 AUG2022 SEP2022 OCT2022 NOV2022 DEC2022 JAN2023 FEB2023 MAR2023 APR2023 MAY2023 JUN2023 JUL2023 AUG2023 SEP2023 OCT2023 NOV2023 DEC2023 Island St Thomas 55086.0 57929.0 72103.0 67469.0 60092.0 67026.0 66353.0 50660.0 24507.0 34025.0 44500.0 58735.0 60470.0 56826.0 64249.0 56321.0 49534.0 56950.0 61110.0 42745.0 25047.0 34462.0 NaN NaN St. Croix 11550.0 12441.0 14094.0 12196.0 13385.0 14009.0 13768.0 10673.0 6826.0 10351.0 9635.0 12661.0 12755.0 13289.0 15880.0 13092.0 16497.0 15728.0 16879.0 12102.0 6298.0 9398.0 NaN NaN
内容的提问来源于stack exchange,提问作者Jared Greathouse
相关产品推荐
相关产品推荐

