7. DataFrame如何从文件中读取数据以及如何将DataFrame保存到文件中

pandas可以将DataFrame数据保存到很多种形式的文件中,例如csv,excel, json, 同时,pandas也可以从csv,excel, json 等文件中读取数据加载成DataFrame。

1. 保存DataFrame到文件中

1.1 保存到csv文件

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.index.name = '姓名'
df.to_csv('stu.csv', encoding='gbk')

处理中文一直是个麻烦,即便是在python3中,依然如此,如果数据中有中文,保存到csv中,使用Excel打开就会出现乱码,因此要设置encoding参数,很多资料说需要设置为utf_8_sig, 但在我的电脑上,不起作用,我只好使用了gbk。如果你不想使用Excel打开,而是直接查看文本文件,那么可以不是设置encoding参数,以文本方式打开时,不会有乱码。

我设置了行索引的名称,为的是保存到csv文件中时,让“姓名”成为行索引的列名

姓名,数学,语文
小明,92,90
小红,87,98
小刚,90,87
小丽,98,90

不然,第一行会变成

,数学,语文

to_csv有几个参数需要掌握

参数名 含义 默认值
sep 分割符 默认是半角逗号
na_rep 替换空值 空字符串
float_format float格式 默认没有,设置成'%.2f'表示保留两位小数
columns 设置保存列 默认都保存, 类型是列表
header 是否保存列名即列索引 True
index 是否保存行索引 True

1.2 保存到excel

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.to_excel('stu.xls', sheet_name='考试成绩')

sheet_name 设置文件中的sheet名称,其他参数可以参考to_csv

1.3 保存到json文件

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.to_json('stu.json', force_ascii=False)

df = pd.read_json('stu.json')
print(df)

force_ascii设置为False,可以在文件中正常显示中文, 使用read_json方法可以从json文件中读取数据

1.4 使用msgpack作为序列化工具写入到文件中

to_msgpack方法支持使用msgpack作为序列化工具,将数据序列化以后写入到文件中, 响应的,读取时使用read_msgpack方法

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.to_msgpack('stu.data')

# 读取
df = pd.read_msgpack('stu.data')
print(df)

1.5 使用pickle作为序列化工具写入到文件中

使用to_pickle方法,将以pickle模块序列化数据并写入到文件中,相应的读取数据需要使用read_pickle方法

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.to_pickle('stu.data')

df = pd.read_pickle('stu.data')
print(df)

1.6 保存到html文件中

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.to_html('stu.html')

df = pd.read_html('stu.html', encoding='utf-8')
print(df)

使用pd.read_html可以从html文件中读取数据,但获得数据不再是DataFrame,而是一个list

2. 从文件中读取数据

前面在介绍如何保存到文件中时,有几种保存方式顺带着介绍了如何读取数据,接下来要重点介绍几个从文件中读取数据的方法,因为他们被使用频率最高

2.1 read_csv

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.index.name = '姓名'
df.to_csv('stu.csv')

df = pd.read_csv('stu.csv')
df.set_index('姓名', inplace=True)
print(df)

从csv中读取数据后,会默认用从0开始的整数序列作为行索引,我使用set_index方法重新设置姓名列为行索引。

2.2 read_excel

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.index.name = '姓名'
df.to_excel('stu.xls', sheet_name='考试成绩')

df = pd.read_excel('stu.xls')
print(df)

read_excel专门从excel文件中读取数据

2.3 read_table

read_table是pandas读取表格数据的通用方法, 该方法有很多参数,但绝大多数都不需要设置,尝试用的是sep参数,规定了数据之间的分割符

import pandas as pd

data = [
    {'语文': 90, '数学': 92},
    {'语文': 98, '数学': 87},
    {'语文': 87, '数学': 90},
    {'语文': 90, '数学': 98},
]

df = pd.DataFrame(data, index=['小明', '小红', '小刚', '小丽'])
df.index.name = '姓名'
df.to_csv('stu.csv')

df = pd.read_table('stu.csv')
print(df)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案