Python如何按月份统计Col3列S、D数量并绘制双折线图
需求说明
- 按
Col4列的月份维度,统计Col3列中S、D两类取值的出现数量 - 输出X轴为月份、包含S、D两条计数折线的统计图
- 现有代码仅实现了全局S、D计数的柱状图,缺少按月关联统计的逻辑
现有资源
已编写代码
#to plot the number of S and D in col3 df = pd.read_csv (r'C:\Users\data.csv', usecols = ['Col1','Col2','Col3','Col4']) df['Col4'] = pd.to_datetime(df['Col4'], format="%m/%d/%Y").dt.date df.head() df1 = df[['Col3']].copy() my_dict = df1['Col3'].value_counts().to_dict() myList = my_dict.items() x, y = zip(*myList) plt.bar(x, y, color = "tomato") plt.ylabel('Count') plt.title('Outcome') plt.show()
样例数据
| 序号 | Col1 | Col2 | Col3 | Col4 |
|---|---|---|---|---|
| 0 | Y | MA | S | 2/2/2022 |
| 1 | N | YJ | D | 4/25/2022 |
| 2 | N | YJ | D | 3/11/2022 |
| 3 | N | YJ | D | 4/28/2022 |
| 4 | Y | YJ | D | 4/21/2022 |
| 5 | N | YJ | D | 4/21/2022 |
| 6 | Y | WE | D | 5/25/2022 |
| 7 | Y | WE | S | 5/7/2022 |
| 8 | N | WE | D | 3/30/2022 |
| 9 | N | PR | D | 3/22/2022 |
| 10 | Y | PR | S | 3/22/2022 |
实现方案
直接在原有逻辑基础上补充月份提取、分组统计步骤即可,完整可运行代码如下:
import pandas as pd import matplotlib.pyplot as plt # 读取并解析日期 df = pd.read_csv(r'C:\Users\data.csv', usecols=['Col1','Col2','Col3','Col4']) df['Col4'] = pd.to_datetime(df['Col4'], format="%m/%d/%Y") # 提取年月维度,格式统一为年-月,保证X轴按时间顺序排序 df['month'] = df['Col4'].dt.strftime('%Y-%m') # 按月、Col3取值分组计数,将S/D转换为单独列,缺失计数填0 monthly_stats = df.groupby(['month', 'Col3']).size().unstack(fill_value=0) # 绘制双折线图 plt.figure(figsize=(9, 5)) plt.plot(monthly_stats.index, monthly_stats['S'], marker='o', label='S count') plt.plot(monthly_stats.index, monthly_stats['D'], marker='s', label='D count') plt.xlabel('Month') plt.ylabel('Count') plt.title('Monthly S/D Count Statistics') plt.legend() plt.grid(alpha=0.3) plt.show()
- 提取月份时保留年份信息,避免跨年同月数据被错误合并
- 分组统计后用
unstack转宽表,可直接传入绘图函数生成两条折线,无需手动拆分数据 - 折线添加节点标记,方便读取每个月的具体数值
内容的提问来源于stack exchange,提问作者apogee
相关产品推荐
相关产品推荐

