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)
最后的结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值