需求:一个excel表格,内有46个sheet页,每个sheet页都有30组左右的数据,需要计算每个sheet页中每组数据的TRIMMEAN。并将计算的结果存在当前sheet页中
原始数据格式如图所示,
解决办法:首先是找到计算TRIMMEAN的库,即需要用到scipy中的stats,里边有trim_mean()方法
第二步:要求将d=(1,2,4)的所有a列的数据读取出来,传给trim_mean()进行计算,并将计算结果保存到表格中,
代码如下
import pandas as pd
from scipy.stats import *
excelname = 'dura.xlsx' #原始数据文件
writ = pd.ExcelWriter('dura1.xlsx') #创建新的excel表格
def trim11(a): #计算trimmean的函数
return trim_mean(a,0.2)
for x in range(0,46): # 循环读取sheet页
df = pd.read_excel(excelname,sheet_name=x) #读取原始数据文件,并通过循环读取不同的sheet页面
dlist = [] #创建空列表,存储duration
ralist = [] #创建空列表,存储计算的结果rate
dict1 = {"du":0,"ra":0} # 创建字典,存储结构保存使用
for y in range(1,40): #循环判断d是否存在,因为每个sheet页中的duration并不是从1开始的,有的从1开始,有的从2开始
if y in df['d'].values: #判断d是否存在该值,如果存在,继续下面的代码
a = df.loc[df['d']==y,['d','a']] #存在d,则筛选d,例如duration=1,则把所有的1都筛选出来
aa = a['a'].values #筛选出来所有的d=1后,把对应的a值取出来,并赋值给aa
b = trim11(aa) #将aa变量存储的值传入到计算trimmean的函数中,改函数会返回计算结果,并将结果赋值给b
# print(x+1,y,b) #x为sheet名称,y为d,b为a的值
dlist.append(y) #将当前循环中的d值添加到dlist列表中
ralist.append(b) #将当前循环中计算的a结果添加到ralist列表中
#下面的代码是将列表添加到字典中
dict1['du'] = dlist
dict1['ra']=ralist
#下面的代码是将dict1字典的数据转换成DataFrame数据,pandas库可以识别的数据,并保存到excel中
data2 = pd.DataFrame(dict1)
savedata = pd.concat([df,data2],axis=1)
savedata.to_excel(writ,sheet_name=str(x+1)) #保存时指定不同的sheet名称
#所有的循环操作结束,将文件进行保存
writ.save()
writ.close()