如何用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
相关产品推荐
相关产品推荐

