Python编程学习圈 2020-05-25

Python玩转Excel:实现函数自动填充、数据排序_Python

工作中,大家经常会使用excel去处理数据以及展示,但是对于部分工作我们可以借助程序帮忙实现,达到高效解决问题的效果。

比如将接口返回的json解析并保存结果到excel中,按一定规律处理excel中的数据然后写入到新的excel文件中,汇总来自多个文件的内容到一个excel中等等。

平时在工作中遇到比较繁琐的数据需要写入到excel中,除非excel的内置公式可以处理,否则我会第一时间想到使用python处理。

在处理海(大)量数据时,用Excel处理可能不会那么方便操作,特别是列很多,一屏显示不全的话,操作起来确实不便。如果我们能够熟练掌握Python操作Excel,便可大大提高工作效率。


好用到爆的自动填充功能

下面我们模仿Excel,用Pandas实现函数自动填充功能,计算列。

读取文件,计算总价

import pandas as pd#读取Excel文件books = pd.read_excel('book1.xlsx',index_col='ID')print(books)************************NAME1 单价 数量 总价ID1 Book1 10.5 10 NaN2 Book2 11.0 10 NaN3 Book3 11.5 10 NaN4 Book4 12.0 10 NaN

在Excel里面,我们可以写函数,自动填充,也比较方便。

但在Python里只需要一行代码即可,虽然这看起来似乎还是没有Excel速度快,操作方便,但当数据量很大的时候,且计算比较繁琐的时候,pandas数据操作优势就凸显出来了。

1. books['总价']=books['单价']*books['数量']

也可以使用下面的语句实现,显然上面方法比较简单,但下面方法很适合于从某一段开始计算。

2. for i in books.index: books['总价'].at[i]=books['单价'].at[i]*books['数量'].at[i]

运行结果:

NAME1 单价 数量 总价ID1 Book1 10.5 10 105.02 Book2 11.0 10 110.03 Book3 11.5 10 115.04 Book4 12.0 10 120.0

下面,我们给每本书涨2块钱

第一种方法:

books['单价']= books['单价']+2

第二种方法:使用lambda表达式

books['单价']=books['单价'].apply(lambda x:x+2)
     NAME1    单价  数量     总价ID1    Book1  12.5  10  105.02    Book2  13.0  10  110.03    Book3  13.5  10  115.04    Book4  14.0  10  120.0

只要你乐意,怎么排都行

数据排序,函数sort_values用法:

DataFrame.sort_values(by='##',axis=0,ascending=True, inplace=False, na_position='last')

参数说明:

参数            说明by               指定列名(axis=0或'index')或索引值(axis=1或'columns')axis             若axis=0或'index',则按照指定列中数据大小排序;若axis=1或'columns',则按照指定索引中数据大小排序,默认axis=0ascending  是否按指定列的数组升序排列,默认为True,即升序排列inplace        是否用排序后的数据集替换原来的数据,默认为False,即不替换na_position {'first','last'},     设定缺失值的显示位置

下面我们对价格降序排列

import  pandas as pdproducts = pd.read_excel('book2.xlsx',index_col='ID')products.sort_values(by='价格',inplace=True,ascending=False)print(products)

划重点如果需要对满足两个条件的排序,by=[list]列表即可,是不是也很简单

products.sort_values(by=['是否值得购买','价格'],inplace=True,ascending= [True,False])

运行结果:

ID  商品 价格 是否值得购买10 product10 201 no5 product5 65 no7 product7 45 no9 product9 199 yes8 product8 156 yes3 product3 123 yes4 product4 111 yes1 product1 100 yes2 product2 88 yes6 product6 76 yes


绘图前准备工作,数据筛选和过滤(loc函数)

apply函数是pandas里面所有函数中自由度最高的函数。

该函数如下:

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。

这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据 结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。

目标:读取学生信息表,筛选出符合年龄段(18岁到20岁)和成绩段(85分到100分)的学生。

import  pandas as pddef age18_20(age):   #18<=age<=20 Python特有写法    return   18<=age<=20def  level_s(score):    return 85<=score<=100stu = pd.read_excel('students.xlsx',index_col='ID')stu=stu.loc[stu['年龄'].apply(age18_20)].loc[stu['成绩'].apply(level_s)]print(stu)

运行结果:

    姓名  年龄  成绩ID5   李2  18  888   王3  19  86

大家可以优化上面代码,使用 lambda表达式,尽量不使用函数,显得代码简洁、高效和高大上。


高大上的数据可视化

Python玩转Excel:实现函数自动填充、数据排序_Python_02

import  pandas as pdimport matplotlib.pyplot as plt#读取数据stu = pd.read_excel('students.xlsx',index_col='ID')#排序stu.sort_values(by='成绩',inplace=True)#生成柱状图stu.plot.bar(x='姓名',y='成绩',color="orange",title='学生成绩表')#或  plt.bar(stu['姓名'],stu['成绩'],color="orange")#紧促显示plt.tight_layout()#显示图片plt.show()