Python处理Excel&CSV文件

咪哥杂谈

共 2488字,需浏览 5分钟

 ·

2020-01-02 23:22

咪哥杂谈


ba00ba9551b222e9f88809aa768b5528.webp

本篇阅读时间约为 5 分钟。


1

前言


在今年很早的时候,写过一篇用 Python 玩 Excel 的文章,可以回顾《Python操作 excel ?应该这么玩!


当时介绍了用 Pandas 库玩股票,在 Excel 中画出一个图来。


现在有了前几天爬取的王者荣耀 csv 文件,还需要用 pandas 库来操作处理下。


实战中去体会这些第三方库的使用技巧,印象才会比较深刻。


2

环境准备


开始之前,首先确保你安装了 pandas 库。


pip install pandas


简单用官网介绍的文字来说明下,何为 pandas?


Pandas是一个开源的,BSD许可的库,为Python编程语言提供高性能,易于使用的数据结构和数据分析工具。


https://www.pypandas.cn/intro/

pandas中文官网


3

处理数据


有些时候,使用一些工具类的库,如何才能更好地练手?
一旦有了使用场景,那么,便是最好的练手机会。(再次强调)

现在我的需求很明确了:

有一个王者荣耀的 csv 数据,我需要将其读取到,然后将字典类型变成列,同时,需要让头像下载后自动写进 Excel 中。

而 Excel 的数据最终会提供给玩王者的朋友们, 也为了后续的分析用。


1.  pd.read_csv()


import pandas as pddf = pd.read_csv(path)  # 读取 csv 文件,看返回的是什么?


打个断点看下,df最终返回的结果:


13a709f4cc96da3e3eabe1ddefefed49.webp


查看 debug 面板,df 的类型是 DataFrame。


0ae3b3a5ca0af2b8d6e37476ca62b031.webp


来看下官网是如何介绍的?


fba6d1d66e4a0e123307f2ccd2fcd7d3.webp

如果还不理解,你可以把 DataFrame 想成 Excel 中的 Sheet 页,它有着行和列,所以称之为二维异构表格。


2. df['列名'] 获取单列


在原来的 csv 中,有两列是字典类型的,现在需要将每列的每行数据取出来,并且生成新的列,而列名就是字典中的 key ,单列的每行数据则是字典中的 value。

attr_details_data_dict = df['attr_details_data_dict']  # 获取单列



86a3dba86a462849225cfaaac33fab54.webp


取出来则是单列,而类型是 Series ,一维同构数组。(看上面官方的图介绍)

3. pd.DataFrame(dict) 创建新的DataFrame


detail_col_list = []for detail_str in attr_details_data_dict:    detail_df = pd.DataFrame(json.loads(detail_str), index=[0])    detail_col_list.append(detail_df)


不难发现,现在的单列数据中每行看似都是 dict 类型的,但用 for 循环遍历时,取出的数据则是 str 类型,所以要用 json 库转换成 dict。


在用 pd.DataFrame 来构造新的 DataFrame,需要注意,构造时,dict 中的 value 值必须是可迭代的类型,比如 list 等,不然会报错:


e3b3a5e88d1cf031127cd96ddc1ac2c5.webp


由于现在 dict 中的 value 是单个字符串,所以需要加上 Index=[0] 的参数,方可解决问题。


7d217e1333f1d3d17ce70032a97c24d6.webp


这样最终构造出来的每个单独的 DataFrame,我们将其追加到一个列表中,便于后续合并使用。


4. pd.concat([df1,df2....]) 合并DataFrame


new_detail_df = pd.concat(detail_col_list, axis=0, ignore_index=True)


参数 axis=0 表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引。


b0c5e1dd977f45eae385053d29e93285.webp


最终,你可以看到由 list 中多个 df 上下合并而成大的 df,和 csv 中的顺序一致,数据一致。


PS : 关于这里的 for 循环,如果你会列表表达式,可以写成一行处理,很简洁:


detail_col_list = [pd.DataFrame(json.loads(detail_str), index=[0]) for detail_str in attr_details_data_dict]




上面四步骤是在处理原来英雄的初始化数值的参数。


原 csv 中还有一列,也是 dict 类型,类似处理即可。


当然如果你对 Excel 处理,以上的后三部也是适用的。


4

pandas写入Excel


写入 Excel 之前,我们有一项工作没有做,就是将我们新增的列合并到原有的 df 上去,把原来 df 中的两个 dict 列去除掉。


1. 去除 df 中的某列。df.drop(['列名'],axis=1)


df2 = df.drop(['attr_details_data_dict', 'recommand_stars_dict'], axis=1)   # 删除已经处理过的列print(df2.columns) # 打印列名


a7eff79f259c31e34699dbd5b3be183a.webp


2. 将新增列合并删除后的列上。


依然采用 concat 函数去做合并,这次是左右合并,所以 axis=1 ,列合并(左右), axis=0,行合并(上下)。


# 合并新旧列final_df = pd.concat([df2, new_detail_df, new_recommend_df], axis=1)


结果:


3f19346b16e6ce0e140ec33dfa9476e7.webp


3. 写入 Excel


写入操作很简单,只需要如下:


final_df.to_excel('xxx.xlsx')


5

总结


pandas的操作,已经有了中文的官方文档,非常友好,大家可以对照中文文档去看下。


关于 Excel 中的头像下载,以及 Excel 的数据清理,放在下一篇文章中讲解。本篇内容长度足矣了,不继续写了。


老规矩,本章代码已经上传到 github 上,后台回复 王者数据 ,即可获得源码和excel文件!




▼往期精彩回顾▼年终总结 | 盘点2019展望2020
pyspider爬取王者荣耀数据(上)
pyspider爬取王者荣耀数据(下)


d47ed374b2b5b0f7bb4038789347e5a7.webp你点的每个在看,我都认真当成了喜欢
浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报