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

Python中使用groupby分组数据:求更优雅的DataFrame转换实现方式

更优雅的Pandas分组列转换方案

嘿,你的需求其实完全可以用Pandas内置的透视表函数或者unstack方法来实现,比循环拼接的写法简洁太多,而且效率更高!

先看看你原来的代码逻辑:把每月的数据按年份分组后,逐个拼接成列。这种循环的写法不仅代码冗余,当数据量变大时,多次pd.concat的性能也会下降。下面给你两种更优雅的实现方式:

方法1:使用unstack(推荐,最简洁)

利用多级索引的unstack操作,直接把月份从行维度转到列维度:

import pandas as pd
import numpy as np

# 生成原始数据
df = pd.DataFrame(
    {'date': pd.date_range(start='2016-01-01', periods=48, freq='M'),
     'value': np.random.normal(size=48)}
).set_index('date')

# 核心一步:提取年、月作为多级索引,再unstack月份到列
dfc = df.assign(
    year=df.index.year,
    month=df.index.month
).set_index(['year', 'month'])['value'].unstack(level='month')

# 给列重命名为月份缩写(可选)
month_names = ['jan','feb','march','april','may','june','july','aug','sept','oct','nov','dec']
dfc.columns = month_names[:len(dfc.columns)]

为什么这个更好?

  • 没有循环,代码逻辑一目了然:先把年份和月份设为多级索引,再将月份“展开”成列。
  • Pandas的unstack是底层优化过的操作,比手动循环拼接高效得多,尤其是数据量大的时候。
  • 自动处理年份的对齐,不需要手动判断分组顺序。

方法2:使用pivot_table(更直观,适合需要聚合的场景)

如果你的数据可能存在同一个年月有多条记录的情况,用pivot_table可以同时完成分组和聚合:

# 核心代码
dfc = df.pivot_table(
    values='value',
    index=df.index.year,  # 行索引为年份
    columns=df.index.month  # 列维度为月份
)

# 同样重命名列(可选)
month_names = ['jan','feb','march','april','may','june','july','aug','sept','oct','nov','dec']
dfc.columns = month_names[:len(dfc.columns)]

这个方法的优势:

  • 语法非常直观,明确指定“值、行、列”三个维度,新手也能快速理解。
  • 如果有重复的年月数据,可以通过aggfunc参数指定聚合方式(比如aggfunc='mean'求均值,aggfunc='sum'求和),默认是求均值。

对比原来的代码

原来的循环写法需要逐个提取分组再拼接,不仅代码长,还容易出错(比如分组顺序不对、列名手动输入容易写错)。而上面两种方法都是一行核心代码搞定,自动处理所有对齐和分组逻辑,代码可读性和维护性都提升很多。

内容的提问来源于stack exchange,提问作者Raul Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:32:18