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

