工作中,大家经常会使用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 单价 数量 总价
ID
1 Book1 10.5 10 NaN
2 Book2 11.0 10 NaN
3 Book3 11.5 10 NaN
4 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 单价 数量 总价
ID
1 Book1 10.5 10 105.0
2 Book2 11.0 10 110.0
3 Book3 11.5 10 115.0
4 Book4 12.0 10 120.0
下面,我们给每本书涨2块钱
第一种方法:
books['单价']= books['单价']+2
第二种方法:使用lambda表达式
books['单价']=books['单价'].apply(lambda x:x+2)
NAME1 单价 数量 总价
ID
1 Book1 12.5 10 105.0
2 Book2 13.0 10 110.0
3 Book3 13.5 10 115.0
4 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=0
ascending 是否按指定列的数组升序排列,默认为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 no
5 product5 65 no
7 product7 45 no
9 product9 199 yes
8 product8 156 yes
3 product3 123 yes
4 product4 111 yes
1 product1 100 yes
2 product2 88 yes
6 product6 76 yes
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 pd
def age18_20(age):
#18<=age<=20 Python特有写法
return 18<=age<=20
def level_s(score):
return 85<=score<=100
stu = pd.read_excel('students.xlsx',index_col='ID')
stu=stu.loc[stu['年龄'].apply(age18_20)].loc[stu['成绩'].apply(level_s)]
print(stu)
运行结果:
姓名 年龄 成绩
ID
5 李2 18 88
8 王3 19 86
大家可以优化上面代码,使用 lambda表达式,尽量不使用函数,显得代码简洁、高效和高大上。
import pandas as pd
import 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()
在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,800+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会! https://shimo.im/docs/JWCghr8prjCVCxxK/ 《Python学习资料》
关注公众号【Python圈子】,优质文章每日送达。