Pandas按区域分组统计0/1鸟类数据并绘制分组柱状图
实现步骤
你之前groupby聚合结果异常,大概率是两个原因:一是没有指定仅对4个鸟类列做聚合,把area/year这类非统计字段纳入了计算;二是如果你的1/0是字符串格式,直接求和会触发字符串拼接,得到无意义的结果。
按以下步骤实现即可:
- 第一步:导入依赖、定义鸟类列名,统一把鸟类列转为数值类型(如果列本身已经是整数格式可跳过转换步骤)
import pandas as pd import matplotlib.pyplot as plt # 定义需要统计的鸟类列 bird_columns = ['swallow', 'sparrow', 'kite', 'finch'] # 把字符串格式的'0'/'1'转为整数0/1 df[bird_columns] = df[bird_columns].astype(int)
- 第二步:按
district分组,对鸟类列求和得到每个区域各类鸟的观测总次数(取值为1代表出现,求和结果就是总出现次数)
district_bird_count = df.groupby('district')[bird_columns].sum()
用你提供的样例数据,运行后得到的统计结果如下,完全符合预期:
| district | swallow | sparrow | kite | finch |
|---|---|---|---|---|
| aaa | 4 | 3 | 2 | 4 |
| bbb | 1 | 1 | 2 | 1 |
- 第三步:绘制柱状图
- 单区域单独出图(每个区一个独立柱状图)
# 根据区域数量自动调整子图布局,这里按1行排列 fig, axes = plt.subplots(nrows=1, ncols=len(district_bird_count), figsize=(12, 4)) for ax, (district_name, count_res) in zip(axes, district_bird_count.iterrows()): count_res.plot(kind='bar', ax=ax, title=f'区域{district_name}鸟类出现次数') ax.set_ylabel('总观测次数') ax.set_xlabel('鸟类种类') plt.tight_layout() plt.show()
- 所有区域合并到同一张柱状图做对比
district_bird_count.plot( kind='bar', figsize=(8, 5), xlabel='区域', ylabel='总观测次数', title='各区域鸟类出现次数统计' ) plt.show()
内容的提问来源于stack exchange,提问作者oddbook
相关产品推荐
相关产品推荐

