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

如何用Pandas绘制分组后各城市月度计数的双折线图

解决Pandas按城市拆分月度数据并绘制折线图的问题

嗨,我来帮你搞定这个需求!你之前只按月份groupby导致城市数据被合并了,想要在同一张图里展示城市A和B的月度计数折线,关键是要同时按月份和城市分组,再把数据整理成适合绘图的宽格式。下面是具体步骤和代码示例:

步骤1:预处理日期列(确保月份提取准确)

首先要保证你的日期列是datetime类型,这样才能正确提取月份信息:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的数据框是df,包含date(日期)、city(城市)、count(计数列)三列
df['date'] = pd.to_datetime(df['date'])
# 提取年月格式的月份(比如"2023-01"),这样X轴显示更清晰
df['month'] = df['date'].dt.to_period('M')

步骤2:按月份+城市分组并整理数据

这里有两种常用方法,效果是一致的:

方法一:groupby + unstack

先按月份和城市分组计算月度总和,再用unstack()把城市转换成列:

# 按月份和城市分组,计算月度计数(用sum还是count看你的实际需求)
monthly_city_counts = df.groupby(['month', 'city'])['count'].sum().unstack()
# 此时monthly_city_counts的索引是月份,列是城市A和城市B

方法二:pivot_table(更直观)

用透视表直接生成宽格式数据,逻辑更清晰:

monthly_city_counts = pd.pivot_table(
    df,
    values='count',
    index='month',  # X轴维度:月份
    columns='city',  # 拆分维度:城市
    aggfunc='sum'  # 聚合方式:求和/计数
)

步骤3:绘制双折线图

现在数据格式已经是每列对应一个城市,直接调用plot()就能自动生成两条折线:

# 绘制折线图,设置画布大小和标记点
ax = monthly_city_counts.plot(kind='line', figsize=(10, 6), marker='o')

# 自定义图表样式
ax.set_title('城市A vs 城市B 月度计数对比', fontsize=14)
ax.set_xlabel('月份', fontsize=12)
ax.set_ylabel('月度计数', fontsize=12)
# 手动指定图例名称(如果自动生成的不符合预期)
ax.legend(['城市A', '城市B'], loc='upper left')

# 显示图表
plt.show()

为什么之前的方法不行?

你之前只按month分组,相当于把城市A和B的月度数据直接累加合并,丢失了城市的维度信息。而同时按month和city分组后,再通过unstack或透视表把城市转成列,就能让Pandas自动识别每条折线对应的城市数据啦。

内容的提问来源于stack exchange,提问作者jxn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:01:26