Python DataFrame多县销售收入数据的统计计算与子图可视化实现咨询
Python DataFrame多县销售收入数据的统计计算与子图可视化实现咨询
嘿,刚接触Python不用慌,我来帮你一步步解决这个问题~
首先说统计计算的部分——要算每个县的销售收入总和与均值,完全不用写for loop,用pandas的groupby分组统计是最高效的方式,一行代码就能搞定:
# 按县分组,计算Sales和Income的sum与mean county_stats = df_staging.groupby('County Name')[['Sales', 'Income']].agg(['sum', 'mean']) print(county_stats)
这段代码会直接生成一个新的DataFrame,每个县对应一行,列是Sales/Income分别的总和和均值,清晰明了。
接下来是可视化的部分,先帮你修正原来的for loop代码问题:你原来的循环里,i已经是每个县的名字(比如A1、A2),但你写了ind_county[i],这是错误的——因为ind_county是去重后的县名Series,i是元素值不是索引,所以直接用i匹配就行。另外,为了让子图布局更整齐,我们可以用matplotlib的subplots先创建好子图网格,再循环画图:
import matplotlib.pyplot as plt # 获取所有唯一的县名,这里先取前2个做测试 ind_county = df_staging['County Name'].drop_duplicates().tolist()[:2] # 创建子图网格,比如2列,行数自动计算 row_num = (len(ind_county) + 1) // 2 # 向上取整 fig, axes = plt.subplots(row_num, 2, figsize=(12, 6)) axes = axes.flatten() # 把二维的axes数组转成一维,方便循环 for idx, county in enumerate(ind_county): # 筛选当前县的所有数据 county_data = df_staging[df_staging['County Name'] == county] # 在对应子图上画柱状图,同时展示Sales和Income county_data.plot.bar(x='Year', y=['Sales', 'Income'], ax=axes[idx], title=f'{county} 年度销售与收入') axes[idx].tick_params(axis='x', rotation=45) # 旋转年份标签,避免重叠 # 隐藏多余的空自图(如果县的数量是奇数的话) for ax in axes[len(ind_county):]: ax.axis('off') plt.tight_layout() # 自动调整子图间距,避免标题和标签重叠 plt.show()
如果你不想写for loop,用seaborn的FacetGrid可以自动帮你生成分组子图,完全不用自己处理循环逻辑,特别适合这种按类别分图的场景:
import seaborn as sns import matplotlib.pyplot as plt # 初始化FacetGrid,按County Name分组,每行放2个子图 g = sns.FacetGrid(df_staging, col='County Name', col_wrap=2, height=4) # 给每个子图添加Sales和Income的柱状图 g.map_dataframe(sns.barplot, x='Year', y='Sales', color='cornflowerblue', alpha=0.7, label='Sales') g.map_dataframe(sns.barplot, x='Year', y='Income', color='orange', alpha=0.7, label='Income') # 添加图例和标题 g.add_legend() g.set_titles('{col_name} 县') g.set_axis_labels('年份', '金额') plt.tight_layout() plt.show()
最后给你个小建议:刚学pandas的话,多熟悉groupby的用法,它是处理分组数据的核心工具,能帮你省超多重复代码;可视化方面,seaborn的高层封装函数(比如FacetGrid、relplot)能大幅减少手动循环的工作量,适合快速生成规范的分组图。
如果还有细节想调整,比如子图的大小、颜色、图例样式之类的,随时说哦~
备注:内容来源于stack exchange,提问作者Kendo96
相关产品推荐
相关产品推荐

