python实现快速数据统计

基于Pandas的办公数据整理

文章起源

哈喽~大家好!写这个文章起因是今天导师临时给我安排了一个任务,需要我为一个学校实验室设备的表格做一下统计。相信大家经常能在网上看到一些关于Python处理办公数据统计相关的文章,其实作为一个工科研究生,在忙于科研的同时也需要处理一些其他数据(其实是不怎么会用Excel,而且如果遇到数据特别多的时候,手动统计数据肯定会非常痛苦,并且电脑可能也会很卡)。那么,为了免于成为这种工具人,使用计算机帮助你处理数据是非常省力的。计算机语言的活学活用将让你在以后的工作中轻松完成任务,顺理成章的摸鱼。之前在做excel表格数据合并的时候,也是使用Python能够快速抽取多个excel中特定数据然后合并。再后来的异常值标记比赛中,活学活用,虽然没有取得什么好成绩,但也在数据处理方面有了自己的方法。

数据分析

首先,先来看一看老板发的这个excel数据。
在这里插入图片描述

可以发现它的表头具有6个标签。老板要求这个最终统计结果需要将得到对应实验室的同名设备的台数,并且它们应该被购置时间单价所区分,并且设备编号需要具有范围。
下面是经过程序处理后得到的结果。
在这里插入图片描述
这个数据在未处理前是1208行,处理后为225行。

Pandas实现

1.读取csv文件。
2.查看表头
3.根据逻辑编写代码

import pandas as pd
pd.set_option('mode.chained_assignment', None)

data = pd.read_csv("表2-7本科实验设备情况.csv",encoding="gbk")
result = pd.DataFrame()
sycsdm = pd.DataFrame.drop_duplicates(data[['实验场所代码']],keep = 'first')
sycsmc = pd.DataFrame.drop_duplicates(data[['实验场所名称']],keep = 'first')
sbbh = pd.DataFrame.drop_duplicates(data[['主要教学实验仪器设备编号']],keep = 'first')
sbdj = pd.DataFrame.drop_duplicates(data[['单价(元)']],keep = 'first')
sbsj = pd.DataFrame.drop_duplicates(data[['购置时间']],keep = 'first')
sbmczj = pd.DataFrame.drop_duplicates(data[['主要教学实验仪器设备(含软件)名']],keep = 'first')

sycsdmlist = sycsdm.values.tolist()

for dm in sycsdmlist:
    needdata = data[data['实验场所代码'].isin(dm)]
    sbmc = pd.DataFrame.drop_duplicates(needdata[['主要教学实验仪器设备(含软件)名']],keep = 'first')
    sbmclist = sbmc.values.tolist()#字符串DataFrame变列表
    for sb in sbmclist:
        dsbmc = needdata[needdata['主要教学实验仪器设备(含软件)名'].isin(sb)]#单设备名称详情
        dsbjg = pd.DataFrame.drop_duplicates(dsbmc[['单价(元)']],keep = 'first')#单设备下获得价格去重
        dsbjglist = dsbjg.values.tolist()
        for jg in dsbjglist:
            wyjgxsb = dsbmc[dsbmc['单价(元)'].isin(jg)]#唯一价格下设备
            dsbgzsj = pd.DataFrame.drop_duplicates(wyjgxsb[['购置时间']],keep = 'first')#唯一价格下设备获得 购置时间 去重        
            dsbgzsjlist = dsbgzsj.values.tolist()            
            for sj in dsbgzsjlist:
                tsjtjgsb = wyjgxsb[wyjgxsb['购置时间'].isin(sj)]#同时间同价格设备
                ts = len(tsjtjgsb)#获取台数
                if ts>1:
                    tsjtjgsbqc = tsjtjgsb.iloc[0]
                    shou = tsjtjgsb.iloc[0]
                    wei = tsjtjgsb.iloc[-1]
                    shoubianhao = shou['主要教学实验仪器设备编号']
                    weibianhao = wei['主要教学实验仪器设备编号']
                    tsjtjgsbqc['主要教学实验仪器设备编号'] = str(shoubianhao)+ '-'+ str(weibianhao)
                    tsjtjgsbqc['设备数量'] = ts
                    result = result.append(tsjtjgsbqc)
                else:
                    tsjtjgsb['设备数量'] = ts
                    result = result.append(tsjtjgsb)
#结果重排
result = result[['实验场所代码','实验场所名称','主要教学实验仪器设备(含软件)名','主要教学实验仪器设备编号'	,'设备数量','单价(元)','购置时间']]
result.to_csv('本科实验设备统计表.csv',encoding="gbk",index = False)

主要思想就是利用一个循环逻辑:
先通过pd.DataFrame.drop_duplicates去对实验场所代码去重,得到一个存着独一无二实验场所代码DataFrame,而后使用函数DataFrame.values.tolist()实验场所代码转换为列表list,这样就可以使用for i in list构造循环,使用**data[data[‘实验场所代码’].isin(i)]**每次循环选择一个实验所去选择后续的数据。
同理,在循环中构造针对剩余表头的循环。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值