查看原文
其他

批量空气质量数据文件合并分析

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:方   言,中南财经政法大学金融学院

本文编辑:杨婉清

技术总编:王子一

Stata&Python云端课程来啦!

好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

  引言

你还在为批量excel文件的合并而发愁吗?看完这篇文章帮你解决文件批量合并问题。若需要案例中的文件,请在评论回复“批量数据处理”~

01引入核心库并构建数据输出目录output
import osimport pandas as pdfrom pathlib import Path

在工作路径下创建output文件夹:

def checkthencreate(path): """ 检查传入的路径是否存在,不存在则创建之 """ inpath = Path(path) if not inpath.exists(): os.path.abspath(inpath) print(f"{inpath}不存在,需要创建") os.popen(f'mkdir {inpath}') print(f"{inpath}创建成功") return inpath

outputpath = checkthencreate('output')
02数据准备

对城市日空气质量文件夹进行遍历:

targetfilename = outputpath / '空气质量数据(日度).csv'datadir = outputpath/ '城市日空气质量' #跨平台路径设置,WIN OS LINUXall_file_list = [file for file in os.listdir(datadir) if not file.startswith('.')]# all_file_list 想要的数据文件名称有很多

从遍历的文件夹中筛选五个工作簿:

for file in all_file_list[:5]: #筛选出五个工作表 print(file) df = pd.read_csv(datadir / file, index_col='日期') df.drop(labels='Unnamed: 0', axis=1, inplace=True) city = file.split('.')[0] df.insert(0, '城市', city) # 在第零列插入一列,值为城市名称 df.drop(labels='日期', axis=0, inplace=True) # 删除索引为日期的行 df.to_csv(targetfilename, mode='a', encoding='utf_8_sig')

将一个工作表按照城市名称分成不同的sheet,并存储到`空气质量数据(日度).csv`文件中:

dfallbak = pd.read_csv(targetfilename)df = dfallbak.copy(deep=True)  #破坏掉的数据内容重新运行一下这里就可以再次恢复

去掉表头:

#附加的方式会增加无用的表头,要进行删除df = df[df['城市'] != '城市']  #等于城市的是无效的,因为想要的是具体城市的名称

删除空气质量为无的缺失值以后还有711797个数据:

#处理无效的质量等级数据df.drop(labels=df[df['质量等级'] == '无'].index, inplace=True)

质量等级为优时的日期,城市和PM2.5值:

df.loc[df['质量等级'] == '优', ['日期', '城市', 'PM2.5']]


描述性统计:

df.describe()

输出到新工作簿,实现所有分城市数据合并至一个excel表格文档中:

tianqi_chengshi_datafile = outputpath / '各城市天气数据.xlsx'with pd.ExcelWriter(tianqi_chengshi_datafile, engine='xlsxwriter') as writer: names = set(df['城市'].values) print(names) for name in names: dff = df[df.城市 == name] #数据过滤 dff.to_excel(writer, sheet_name=name, index=False)

03读入数据并进行数据透视分析

读入数据:

dfs = pd.read_excel(tianqi_chengshi_datafile, sheet_name=None) # None时表示读取所有表格type(dfs)

结果显示为dict,即字典格式。

数据透视表分析:

tardf = pd.DataFrame()for chengshi in dfs: dfson = dfs.get(chengshi) a = dfson.drop(labels=dfson[dfson['质量等级'] == '无'].index) # 删除空气质量为无的缺失值 a = a.loc[dfson['日期'].str.contains('2019')] # 筛选2019年空气质量数据 a['2019'] = a['日期'] #将日期改成2019年,方便阅读与理解 b = a.pivot_table( values='2019', index=['城市', '质量等级'],        aggfunc='count' ) tardf = tardf.append(b.reset_index())
tardf

对透视结果再次进行透视:

#将质量等级变成列坐标进行再透视toushidf = tardf.pivot(index='城市', columns='质量等级')toushidf

列名重新排序:

newcls = ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']# toushidf = toushidf.reindex(columns=newcls, level=1)zldf = toushidf.T.reset_index(level=0).T.iloc[1:].reindex(columns=newcls)#toushidf.T表示转置,横纵轴互换#toushidf.T.reset_index(level=0) dataframe可以有多层索引的,level解决第几层的问题#level=0表示从年开始,=1表示从月开始,维度是用索引进行查找#toushidf.T.reset_index(level=0).T.iloc[1:]将不要的索引删除#reindex(columns=newcls)重新索引指定的列名zldf = zldf.fillna(0)

计算污染指数并排名:

#人为设定等级,并赋予权重
def jisuankq(x): return x.优*(-5) + x.良*(-4) + x.轻度污染*1 + x.中度污染*3 + x.重度污染*5 + x.严重污染*8 #apply是pandas的高级应用zldf['污染指数'] = zldf.apply(lambda x: jisuankq(x), axis=1)#根据污染指数进行排序zldf.sort_values('污染指数')[list(zldf.columns)[:-1]]

写入excel文档输出结果:

tianqi_huizong_datafile = outputpath / '空气质量汇总表.xlsx'with pd.ExcelWriter(tianqi_huizong_datafile, engine='xlsxwriter') as writer: toushidf.to_excel(writer, sheet_name='2019年各城市空气质量', startcol=2) workbook = writer.book cell_format = workbook.add_format({'bold': True, 'font_color': 'red'}) #字体颜色条件格式设置 toushisheet = writer.sheets['2019年各城市空气质量'] toushisheet.set_column('C:C', 20, cell_format) #将输出的表格放在指定的位置 zldf.sort_values('污染指数')[list(zldf.columns)[:-1]].to_excel(writer, sheet_name='2019年各城市空气质量(排名)', startrow=2)

以上就是今天的全部内容了,欢迎各位小可爱点赞关注评论呦~

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。

END

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

 Stata17之日期时间新功能

 Stata17之Lasso新功能

       爱奇艺视频弹幕爬取之《小舍得》        数据可视化利器——Matplotlib

从第七次人口普查看中国人口变化|Stata与Python交互绘图

 200万投资者关注!!哪家公司这么牛?

 
带你领略一天天气之变化

 利用pyecharts看微博粉丝地区分布

 零值太多怎么办?解锁Stata17新命令ziologit

  Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 
速度大比拼之Stata17有多快?

初识PyStata

辞旧迎新——Stata17之Do-file编辑器优化

Stata17新亮点——解放表格输出生产力

【爬虫+可视化】链家网北京租房信息

 手把手教你如何获取股票数据和可视化

  Countvalues——数数的超级小帮手

         frame框架进阶篇

 下拉选择框如何变成“小猫咪” | selenium小技巧

  Python中的运算符知多少?

  快来get缺失值的正确打开方式

  frame框架——我到底在哪个“房间”

如何使用Pandas读取txt文件?

基于MySQL数据库实现增量式爬取

寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存