Python处理Excel&CSV文件

前言

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

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

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

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

环境准备

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

pip install pandas

简单用官网介绍的文字来说明下,何为 pandas?Pandas是一个开源的,BSD许可的库,为Python编程语言提> > 供高性能,易于使用的数据结构和数据分析工具。


处理数据

有些时候,使用一些工具类的库,如何才能更好地练手?

一旦有了使用场景,那么,便是最好的练手机会。(再次强调)

现在我的需求很明确了:

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

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

1.pd.read_csv()

import pandas as pd

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

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

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

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

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

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

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

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

取出来则是单列,而类型是 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 等,不然会报错:

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

这样最终构造出来的每个单独的 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表示忽略原来的索引。

最终,你可以看到由 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 处理,以上的后三部也是适用的。

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) # 打印列名

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

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

# 合并新旧列

final_df = pd.concat([df2, new_detail_df, new_recommend_df], axis=1)

结果:

3.写入 Excel

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

final_df.to_excel('xxx.xlsx')

总结

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

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