通过groupby将数据分组后提取出来

groupby真是个好东西

参考:

python数据分析之Dataframe分组(group by)_dataframe groupby-CSDN博客

【Python】进阶学习:pandas--groupby()用法详解_pandas groupby函数-CSDN博客

get_group

pandas中groupby取出某一组的方法_pandasgroupby分组后 取出分组-CSDN博客

Python 在Python中检查是否(不)在列表中|极客教程 (geek-docs.com)

 Python数据可视化的例子——饼图(pie)_python中pie是什么意思-CSDN博客

问题描述:

提取csv文件中的省市、标准行业字段后,将他们分组,要求知道每个省的某一标准行业字段的数量(问题在于提取)。

 

import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 显示中文标签,处理中文乱码问题
plt.rcParams['axes.unicode_minus'] = False  # 坐标轴负号的处理
plt.axes(aspect='equal')  # 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆

df = pd.read_csv("result_add.csv", encoding='utf-8')
df3 = df[['省市', '行业标准字段']]
df3_gb = df3.groupby(['省市', '行业标准字段']).value_counts()
pro = []
name_num = []   # 行业名称以及数量
num = []
for i in range(len(df3_gb)):
    if df3_gb.index[i][0] not in pro:
        if len(num) != 0 :
            name_num.append(num)
        pro.append(df3_gb.index[i][0])
        num = [[df3_gb.index[i][1], int(df3_gb.values[i])]]
    else:
        num.append([df3_gb.index[i][1], int(df3_gb.values[i])])
name_num.append(num)
print(pro)
for i in range(len(name_num)):
    print(name_num[i])

 

结果如下:

那如果我想变成这个样子的格式呢:

将代码修改一下即可

pro2=[]
min_name=[]
min_num=[]
name_num2=[]
for i in range(len(df3_gb)):
    if df3_gb.index[i][0] not in pro2:
        if len(min_name) != 0 and len(min_num) !=0 :
            name_num2.append([min_name, min_num])
        pro2.append(df3_gb.index[i][0])
        min_name=[df3_gb.index[i][1]]
        min_num=[df3_gb.values[i]]
    else:
        min_name.append(df3_gb.index[i][1])
        min_num.append(df3_gb.values[i])
name_num2.append([min_name, min_num])
print(pro2)
for i in range(len(name_num2)):
    print(name_num2[i])

 

 ok,有数据后就可以可视化一下了。额 。毁灭吧。什么时候bz

 测试代码如下:

plt.pie(x=name_num2[2][1],  #绘图数据edu
        # explode=explode, #指定饼图某些部分的突出显示,即呈现爆炸式
        labels=name_num2[2][0],  #添加教育水平标签
        # colors=colors,
        autopct='%.2f%%',  #设置百分比的格式,这里保留两位小数
        pctdistance=0.8,  #设置百分比标签与圆心的距离
        labeldistance=1.1,  #设置教育水平标签与圆心的距离
        startangle=180,  #设置饼图的初始角度
        radius=1.2,  #设置饼图的半径
        counterclock=False,  #是否逆时针,这里设置为顺时针方向
        wedgeprops={'linewidth':1.5, 'edgecolor':'green'},  #设置饼图内外边界的属性值
        textprops={'fontsize':10, 'color':'black'},  #设置文本标签的属性值
        )

#添加图标题
plt.title('河北省项目比例')
#显示图形
plt.show()

 

 

当然这是测试指定某一条数据的,那我们需要遍历pro2里面的省份然后画出该省份的比例呢:

def plot_pie(data1,data2,title):
    plt.pie(x=data1,  #绘图数据
            labels=data2,  #添加水平标签
            autopct='%.2f%%',  #设置百分比的格式,这里保留两位小数
            pctdistance=0.9,  #设置百分比标签与圆心的距离
            labeldistance=1.1,  #设置教育水平标签与圆心的距离
            startangle=180,  #设置饼图的初始角度
            radius=1,  #设置饼图的半径
            counterclock=False,  #是否逆时针,这里设置为顺时针方向
            wedgeprops={'linewidth':1.5, 'edgecolor':'green'},  #设置饼图内外边界的属性值
            textprops={'fontsize':10, 'color':'black'},  #设置文本标签的属性值
            )
    plt.title(title)
    plt.show()

for i in range(len(pro2)):
    title=""+pro2[i]+"项目比例"
    plot_pie(name_num2[i][1],name_num2[i][0],title)

不过当数据比较多的时候标签会重合就不美观了,需要的自己修改一下。

 

posted on 2024-04-09 10:59  201812  阅读(57)  评论(0编辑  收藏  举报