Python数据处理分析(三)——分类统计,dataframe复制,每一行列数据计算,一列不同元素个数统计,matplotlib画饼图,以数学建模(2011 A)为例

直接上代码了

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import matplotlib as mpl
 
mpl.rcParams["font.sans-serif"]=["SimHei"]   # 正常显示中文及负号
mpl.rcParams["axes.unicode_minus"]=False
 
path = "E:/Model_building/A/"
s7 = pd.read_excel(path+"sheet1-7.xlsx")   
s1 = pd.read_excel(path+"sheet3.xlsx")
s7 = pd.DataFrame(s7.values)
s1 = pd.DataFrame(s1.values)   # 导入数据
看一下s1和s7,由于是一整个建模的题目,所以不做太多解释了,知道数据处理的方式就好。

上面是s7,1到8为8种元素在每一种地区的值,下面s1为八种元素的属性

下面需要用s1的数据对s7进行操作,对于每一行,进行行的for循环。为了不影响s7,令一个s8=s7需要注意,Python中的赋值为相同地址,所以copy复制一下。

s8 = s7.copy()   # dataframe 复制需用copy函数
for i in range(1,9):
    s8.iloc[:, i] /= s1.iloc[i-1, 2]  # 每一列的每一行元素进行计算
 
在下面计算一行中每一个数据占这一行总和的比值,使用两个for循环,一个遍历行计算和,一个遍历这一行的列计算比值

s9 = s8.copy()
for i in range(5):
    s = s9.iloc[i, 1:].sum()  # 计算每一行的和
    for k in range(1,9):
        s9.iloc[i,k] /= s
s9.to_excel(path+"sheet9.xlsx")
下面用matplotlib的pie()画饼图,一共五个图形,遍历五遍

name = ['生活区', '工业', '山区', '交通', '绿地']
for i in range(5):
    labels = ['As', 'Cd', 'Cr', 'Cu', 'Hg', 'Ni', 'Pb', 'Zn']
    elements = list(s9.iloc[i,1:])
    plt.pie(elements, labels=labels, autopct="%3.1f%%" )  # 饼图
    plt.title(name[i])
    plt.show()


下面统计每一种地区的采样数,Pg值,以及该值对应的污染程度,形成一个比较可以看得下去的表格。当然可以使用excel或者手工计算完成,这里使用Python

l = []
for i in range(5):
    p = s8.iloc[i,1:].mean()
    m = s8.iloc[i,1:].max()
    l.append( np.sqrt((pow(p,2)+pow(m,2))/2) )   # 计算Pg列,即采样点综合污染指数
 
s1 = pd.read_excel(path+"sheet1.xlsx")
s1.columns = ['1', '2', '3', '4', '5', '6']
 
c = s1.groupby('6').count()   
c = list(c.iloc[:,0])  # 统计每种地区的采样点个数
newdata = pd.DataFrame(np.zeros([5,3]))
newdata.iloc[:,1] = l   
for i in range(5):
    c[i] = name[i]+"("+str(c[i])+")"   # 将采样点名称和个数合并成字符串
newdata.iloc[:,0] = c
 
 
for i in range(5):   # 按照每种P值的范围,确定等级
    a = newdata.iloc[i,1]
    if a <= 0.7:
        newdata.iloc[i,2] = "安全"
    elif a <= 1:
        newdata.iloc[i,2] = "警戒"
    elif a <= 2:
        newdata.iloc[i,2] = "轻"
    elif a <= 3:
        newdata.iloc[i,2] = "中"
    else:
        newdata.iloc[i,2] = "重"
print(newdata)
最后的结果:

发布了117 篇原创文章 · 获赞 41 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/pangzhaowen/article/details/103941954