大家好,我们说了很多关于Python数据分析的工具。相信一直关注的读者一定对Pandas、NumPy、Matplotlib的各种操作不陌生。今天我们就通过一个简单的数据来学习如何使用Python进行数据分析。本文主要涉及以下三个部分:Pandas数据处理Matplotlib绘图使用pyinstaller将py文件打包成exe虽然本文中使用的数据(医学相关)不会出现在你平时的工作和学习中,但是这样的处理过程作为导入数据,缺失值处理、去重、计算、汇总、可视化、导出等操作很重要,甚至教你如何打包程序进行重复性工作。点击完成!数据及需求说明今天分享的案例来自一个著名的实验CellCountingKit-8。首先我们来看一下原始数据:我们需要完成的主要任务有四个:去掉每组中所有重复的最大值和最小值。根据D0对应的分组对所有数据进行标准化计算每组数据的均值和标准差表:均值汇总表和均值-标准差汇总表绘制折线图,??所以我们需要的结果应该是:创建一个桌面上名为data的文件夹,将原始数据data.xlsx放入其中,运行程序后,该文件夹会新增3个文件:这三个文件就是结果均值汇总表均值-标准差汇总表折线图我们需要。现在我们将解释如何实现它。代码实现先导入库调用函数获取桌面文件夹路径写入全局importpandasaspdimportmatplotlib.pyplotaspltimportosimportrandomdefGetDesktopPath():returnos.path.join(os.path.expanduser("~"),'Desktop')path=GetDesktopPath()+'/data/'导入原始数据并去除缺失值dat=pd.read_excel(path+'data.xlsx',sheet_name=0,header=None,index_col=0)dat=dat.dropna(how='any',axis=0)获取重复次数、组数和天数。原始数据有6天,5组,5次重复。虽然这三个数据也可以直接使用,但是在以后的实验中可能会改变这三个数据。为了让代码能够复用,最好不要写死#获取分组数ngroup=dat.index.value_counts().shape[0]#获取列数,即重复次数nrep=dat.shape[1]#得到天数(运算的批次数),即总行数除以组数,除以一个整数就是返回intnd=dat。shape[0]//ngroup去除最大值和最小值。这里采用的解决方案是逐行升序排序,然后去掉第一个和最后一个数据,可以用apply+lambda处理df=dat.apply(lambdax:sorted(x)[1:nrep-1],axis=1)df=df.to_frame(name='total')foriinrange(nrep-2):df[f'{i+1}']=df['total'].str[i]df.drop(columns=['total'],inplace=True)通过使用匿名函数排序返回Series的升序列表。它必须转换回DataFrame并拆分为三列,最后删除原始返回的列。因此,通过上述代码,在常规列中加入分组信息和批次信息,方便后续汇总表df['group']=df.indexday_lst=[]foriinrange(nd):day_lst.append(f'Day{i}')#使用listcomprehension重复list中的元素并添加新列df['day']=[iforiinday_lstfor_inrange(ngroup)]效果如图:将所有数据按照D0每组的均值,可以简单理解为DObatch计算去除两个极值后的5组每组的平均值。5个batch的5组分别除以D0对应组的平均值)#根据组数,取出D0的所有行,然后逐行计算平均值,文本信息会会被自动忽略mean_lst=df.iloc[0:ngroup,:].mean(axis=1).tolist()#因为下一步是按行迭代,索引的分组信息已经有新的列要express,这里重新设置索引,方便迭代df.reset_index(drop=True,inplace=True)#迭代的内容看着复杂其实不难#本质上就是把迭代行的数据和D0对应的组为index,iindf。iterrows():df.iloc[index,0:nrep-2]=i[0:nrep-2]/mean_lst[index%ngroup]标准化结束后可以得到均值和标准差#同理和std会被忽略非数值列#谨慎使用df['mean']=df.iloc[:,0:nrep-2].mean(axis=1)或df['mean']=df.mean(axis=1)df['std']=df.std(axis=1)#获取最后四列results=df.iloc[:,-4:]制作数据透视表并导出#保留4位有效数字回合tb1=pd。pivot_table(data=results,index='group',columns='day',values='mean').round(4)tb2=pd.pivot_table(data=results,index='group',columns='day',values=['mean','std']).round(4)tb1.to_excel(path+'/result(mean).xlsx',index=True,header=True)tb2.to_excel(path+'/result(mean+std).xlsx',index=True,header=True)在JupyterNotebook中的呈现结果如下,Excel中的呈现如本文开头所示。使用matplotlib画图,添加两个细节。如果在JupyterNotebook中需要添加如下代码%matplotlibinline如果有汉字需要显示,还需要设置plt.rcParams['font.sans-serif']=['SimHei的索引(组名)']带有代码标签的汇总表,可以作为图片使用折线上的颜色和标记样式的测量是根据需要的数量随机非放回采样group_lst=tb1.index.tolist()colors=['b','g','r','c','m','y']color_lst=random.sample(colors,ngroup)markers=['.',',','o','v','^','<','>','1','2','3','4','s','p','*','h','H','+','x','D','d']marker_lst=random.sample(markers,ngroup)最后的绘制代码:#设置画布大小plt.figure(figsize=(8,5))foriinrange(ngroup):plt.plot(tb1.iloc[i,:].tolist(),f'{color_lst[i]}{marker_lst[i]}-',lw=2)plt.xticks(range(0,nd),day_lst,fontsize=18)plt.ylabel('RelativeCellAmount',fontsize=18)plt.legend(group_lst,loc='best',fontsize=12)#让图片的显示分布正常plt.tight_layout()#保存必须在调用显示之前plt.savefig(path+"/linechart.png")plt.show()exe打包首先在命令行使用pip安装pyinstallerpipinstallpyinstaller将完整代码保存为py文件,这里我保存为cck8.py,然后放到data中桌面文件夹,然后打开命令行,cd进入这个文件夹,然后调用第二行命令编译成execdC:\Users\chenx\Desktop\datapyinstaller--onefile--cleancck8.py当然,第二行命令可以自定义添加图标等,这里不做介绍,有兴趣的可以自行探索。
