前面我们学完了 pandas 中最重要的两个数据结构: Series 和 DataFrame,今天来侃侃 pandas 读写文件的那些 tricks,我有十足的信心,大家看了定会有所收获。
假如要保存下面这个 DataFrame
保存到 csv 中,我常用的一行代码是:
df.to_csv('exam_result.csv', index=False, encoding='utf-8-sig')
第一个参数是保存的文件名,第二个参数是不保存 index 索引,第三个参数是指定保存的编码格式为 utf-8-sig。
基于实践是检验真理的唯一标准原则,先做一组不保存/保存 index 索引列的对比实验。
保存 index 的 csv
不保存 index 的 csv
再用 pd.read_csv 分别读这两个文件,如果读取了没有保存了 index 索引的,直接用下面这行代码即可:
df = pd.read_csv('exam_result.csv')
如果是读取了保存了 index 索引列的,用上面这句讲道理也不会报错,但是会多出了一个'Unnamed:0'
列,稍不注意,就会对 iloc 等后续操作造成影响,所以必须去掉这一列,可加一个参数:
index_col = 0
实现,总结来说,读写 csv,有下面两种组合方式:
# wirte of way1
df.to_csv('exam_result.csv', index=False, encoding='utf-8-sig')
# read of way1
df = pd.read_csv('exam_result.csv')
# write of way2
df.to_csv('exam_result.csv', encoding='utf-8-sig')
# read of way2
df = pd.read_csv('exam_result.csv', index_col=0)
至于 encoding 这个参数,为什么取 utf-8-sig 呢?,常见的还有 utf-8,这两者区别联系何在?
由于 Windows 下如果设置为 utf-8,用 Office Excel 打开的话会发现中文乱码,因为 Excel 默认这个文件是有 BOM 的(BOM 是微软提出的,必然要在自家产品上推广),实际上文件没有 BOM,一来二去就乱码了,使用 utf-8-sig 可以有效避免这个问题。
常用的都是 read_csv/to_csv/read_excel/to_excel 这四个来实现读写 csv/excel,实际上常用的还有 json 和 html 两种形式。
df.to_json('exam_result.json')
df = pd.read_json('exam_result.json')
exam_result.json 内容如下:
实际上所有的内容都在一行,为了方便截图,我展开成了六行;其中 '0','1' 等是 index 而不是下标,注意区分。
df.to_html('exam_result.html')
df = pd.read_html('exam_result.html')
exam_result.html 用浏览器打开如下:
csv 全称 Comma Separated Values,即逗号分隔值,见名知意,每行各个字段是以逗号分隔的。
常见的还有 tsv,即 Tab 制表符分隔,其实,这个分隔符,我们可以自定义,以 !、&、@ 等字段值中几乎不会出现的字符为宜,如果是字母 a、b、c,容易造成混乱。无论是 csv、tsv 还是 ?sv,都封装在 read_csv() 函数中,以 sep 参数值作为区分。
df.to_csv('exam_result.msv', sep='@', index=False, encoding='utf-8-sig')
df = pd.read_csv('exam_result.msv', sep='@')
msv 后缀是我随便起的,只要保证读写文件名相同即可。
一个不格式太规范的 csv 举例如下:
不规范之处在于内容没有从表格的左上角开始,如果用常用的· df =pd.read_csv('exam_result.csv')
这样读,打印的 dataframe 如下:
这个时候,参数 skiprows(跳过前几行)和 usecols (只取哪些列) 就派上用场了。
df = pd.read_csv('exam_result.csv', skiprows=2,usecols=['name','sex','course','grade'])
活学活用,利用 usecols,还可以解决前面所说的读取保存了 index 的 csv,出现'Unnamed:0'
的问题。