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

Python:高效绘制Pandas DataFrame按区域分组子图的最优方法

高效绘制可变数量的县域数据折线子图

嘿,我懂你现在的困扰——手动给每个县写一遍过滤、分组的代码不仅啰嗦,要是以后县的数量增减,还得挨个修改代码,太麻烦了!咱们用Python的分组功能和循环就能轻松搞定这个重复劳动,而且能适配任意数量的县,效率拉满!

核心思路:避免重复代码,用分组+批量处理

与其逐个县手动过滤、统计,不如一次性对所有县域数据做分组统计,再循环生成子图。这里有两种实用方案,你可以根据自己的习惯选择:


方案1:先全局统计所有县域的每日数据量(效率更高)

这种方式只需要一次groupby操作就能完成所有统计,数据量大的时候优势明显:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的原始数据已经加载到df中
# 1. 一次性统计每个县每天的数据点数量
# unstack会把county转成列,fillna(0)处理没有数据的日期
daily_counts = df.groupby(['county', 'date_stamp']).size().unstack(level='county').fillna(0)

# 2. 获取所有唯一的县域名称
counties = daily_counts.columns.tolist()

# 3. 动态计算子图布局(比如设3列,行数自动向上取整)
n_counties = len(counties)
n_cols = 3
n_rows = (n_counties + n_cols - 1) // n_cols  # 确保行数能容纳所有子图

# 4. 创建子图网格
fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 10))
axes = axes.flatten()  # 把二维的axes数组转成一维,方便循环遍历

# 5. 循环每个县域绘制折线图
for idx, county in enumerate(counties):
    ax = axes[idx]
    # 取出当前县域的每日数据
    county_daily_data = daily_counts[county]
    # 绘制折线并设置标题、标签
    county_daily_data.plot(kind='line', ax=ax, title=f'Daily Data Points: {county}')
    ax.set_xlabel('Date')
    ax.set_ylabel('Number of Data Points')
    ax.tick_params(axis='x', rotation=45)  # 旋转日期标签避免重叠

# 6. 隐藏多余的空自图(如果县域数量不是列数的整数倍)
for idx in range(n_counties, len(axes)):
    axes[idx].set_visible(False)

# 自动调整子图间距,避免标题、标签重叠
plt.tight_layout()
plt.show()

方案2:按县域分组迭代处理(更直观)

如果你更喜欢逐个处理每个县域的子数据集,这种方式可读性更强:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的原始数据已经加载到df中
# 1. 获取所有唯一的县域名称
counties = df['county'].unique().tolist()

# 2. 动态计算子图布局
n_counties = len(counties)
n_cols = 3
n_rows = (n_counties + n_cols - 1) // n_cols

# 3. 创建子图网格
fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 10))
axes = axes.flatten()

# 4. 循环迭代每个县域的子数据集
for idx, (county_name, county_df) in enumerate(df.groupby('county')):
    ax = axes[idx]
    # 统计当前县域的每日数据量
    daily_data = county_df.groupby('date_stamp').size()
    # 绘制折线并设置样式
    daily_data.plot(ax=ax, marker='o', title=f'{county_name} Daily Data Count')
    ax.set_xlabel('Date')
    ax.set_ylabel('Data Point Count')
    ax.tick_params(axis='x', rotation=45)

# 隐藏多余空自图
for idx in range(n_counties, len(axes)):
    axes[idx].set_visible(False)

plt.tight_layout()
plt.show()

为什么这两种方案更好?

  • 完全适配可变数量的县域:不管是3个还是15个县,代码都不需要修改,自动调整子图布局
  • 避免重复代码:不用再写Surrey1、East_Sussex1这种冗余变量,维护成本大大降低
  • 效率更高:尤其是方案1,只需要一次全局分组统计,比多次单独过滤分组快得多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:28:46