数据接入与导出(IO)¶
我们拿到的数据一般是 CSV、Excel 等格式,将文件加载到 Pandas 的 DataFrame 对象,我们就可以用它的方法进行处理了。在处理结束后,我们也需要将文件导出 Excel 等格式,方便查看。
这种格式比较方便记忆:
导入数据:
df = df = pd.read_<xxx>(),其中df表示数据对象变量。导出数据:
df.to_<xxx>(),使用数据文件的一个方法,将文件导出。>()markdown
几种常见的文件导出函数¶
CSV格式
In [ ]:
Copied!
import pandas as pd
# 文件目录
pd.read_csv('https://www.getwage.xyz/courses/multi_variance/pandas/data/team.csv') # 如果文件与代码文件在同目录下
#pd.read_csv('data/my/data.csv') # 指定目录
#pd.read_csv('data/my/my.data') # CSV 文件扩展名不一定是 csv
# 使用网址 url
#pd.read_csv('https://www.getwage.xyz/courses/multi_variance/pandas/data/birth.csv')
import pandas as pd
# 文件目录
pd.read_csv('https://www.getwage.xyz/courses/multi_variance/pandas/data/team.csv') # 如果文件与代码文件在同目录下
#pd.read_csv('data/my/data.csv') # 指定目录
#pd.read_csv('data/my/my.data') # CSV 文件扩展名不一定是 csv
# 使用网址 url
#pd.read_csv('https://www.getwage.xyz/courses/multi_variance/pandas/data/birth.csv')
Out[ ]:
| Unnamed: 0 | name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|---|
| 0 | 0 | Liver | E | 89 | 21 | 24 | 64 |
| 1 | 1 | Arry | C | 36 | 37 | 37 | 57 |
| 2 | 2 | Ack | A | 57 | 60 | 18 | 84 |
| 3 | 3 | Eorge | C | 93 | 96 | 71 | 78 |
| 4 | 4 | Oah | D | 65 | 49 | 61 | 86 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 95 | 95 | Gabriel | C | 48 | 59 | 87 | 74 |
| 96 | 96 | Austin7 | C | 21 | 31 | 30 | 43 |
| 97 | 97 | Lincoln4 | C | 98 | 93 | 1 | 20 |
| 98 | 98 | Eli | E | 11 | 74 | 58 | 91 |
| 99 | 99 | Ben | E | 21 | 43 | 41 | 74 |
100 rows × 7 columns
In [28]:
Copied!
# 也可以从 StringIO 中读取
from io import StringIO
data = ('col1,col2,col3\n'
'a,b,1\n'
'a,b,2\n'
'c,d,3')
pd.read_csv(StringIO(data))
# 也可以从 StringIO 中读取
from io import StringIO
data = ('col1,col2,col3\n'
'a,b,1\n'
'a,b,2\n'
'c,d,3')
pd.read_csv(StringIO(data))
Out[28]:
| col1 | col2 | col3 | |
|---|---|---|---|
| 0 | a | b | 1 |
| 1 | a | b | 2 |
| 2 | c | d | 3 |
In [24]:
Copied!
pd.read_csv('https://gairuo.com/file/data/dataset/GDP-China.csv')
pd.read_csv('https://gairuo.com/file/data/dataset/GDP-China.csv')
Out[24]:
| 年份 | 国民总收入 | 国内生产总值 | 第一产业增加值 | 第二产业增加值 | 第三产业增加值 | 人均国内生产总值 | |
|---|---|---|---|---|---|---|---|
| 0 | 2018 | 896915.6 | 900309.5 | 64734.0 | 366000.9 | 469574.6 | 64644 |
| 1 | 2017 | 820099.5 | 820754.3 | 62099.5 | 332742.7 | 425912.1 | 59201 |
| 2 | 2016 | 737074.0 | 740060.8 | 60139.2 | 296547.7 | 383373.9 | 53680 |
| 3 | 2015 | 683390.5 | 685992.9 | 57774.6 | 282040.3 | 346178.0 | 50028 |
| 4 | 2014 | 642097.6 | 641280.6 | 55626.3 | 277571.8 | 308082.5 | 47005 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 62 | 1956 | 1030.7 | 1030.7 | 443.9 | 280.4 | 306.4 | 166 |
| 63 | 1955 | 911.6 | 911.6 | 421.0 | 221.5 | 269.1 | 150 |
| 64 | 1954 | 859.8 | 859.8 | 392.0 | 210.8 | 257.0 | 144 |
| 65 | 1953 | 824.4 | 824.4 | 378.0 | 191.6 | 254.8 | 142 |
| 66 | 1952 | 679.1 | 679.1 | 342.9 | 141.1 | 195.1 | 119 |
67 rows × 7 columns
文件指定分隔符号¶
In [ ]:
Copied!
data = 'https://gairuo.com/file/data/dataset/GDP-China.csv'
# 数据分隔转化是逗号, 如果是其他可以指定
#pd.read_csv(data) # 制表符分隔 tab
#pd.read_csv(data, sep='\t') # 制表符分隔 tab
pd.read_table(data) # read_table 默认是制表符分隔 tab
data = 'https://gairuo.com/file/data/dataset/GDP-China.csv'
# 数据分隔转化是逗号, 如果是其他可以指定
#pd.read_csv(data) # 制表符分隔 tab
#pd.read_csv(data, sep='\t') # 制表符分隔 tab
pd.read_table(data) # read_table 默认是制表符分隔 tab
Out[ ]:
| 年份,国民总收入,国内生产总值,第一产业增加值,第二产业增加值,第三产业增加值,人均国内生产总值 | |
|---|---|
| 0 | 2018,896915.6,900309.5,64734,366000.9,469574.6... |
| 1 | 2017,820099.5,820754.3,62099.5,332742.7,425912... |
| 2 | 2016,737074,740060.8,60139.2,296547.7,383373.9... |
| 3 | 2015,683390.5,685992.9,57774.6,282040.3,346178... |
| 4 | 2014,642097.6,641280.6,55626.3,277571.8,308082... |
| ... | ... |
| 62 | 1956,1030.7,1030.7,443.9,280.4,306.4,166 |
| 63 | 1955,911.6,911.6,421,221.5,269.1,150 |
| 64 | 1954,859.8,859.8,392,210.8,257,144 |
| 65 | 1953,824.4,824.4,378,191.6,254.8,142 |
| 66 | 1952,679.1,679.1,342.9,141.1,195.1,119 |
67 rows × 1 columns
列、索引、名称¶
In [ ]:
Copied!
# 默认第一行是表头,可以指定,如果指定列名会被忽略
pd.read_csv(data, header=0)
pd.read_csv(data, header=None) # 没有表头
pd.read_csv(data, names=['列1', '列2']) # 指定列名列表
# 如没列名,自动指定一个: 前缀加序数
pd.read_csv(data, prefix='c_', header=None)
# 读取部分列
pd.read_csv(data, usecols=[0,4,3]) # 按索引只读取指定列,顺序无关
pd.read_csv(data, usecols=['列1', '列5']) # 按索引只读取指定列
# 指定列顺序,其实是 df 的筛选功能
pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']]
pd.read_csv(data, index_col=0) # 第几列是索引
# 以下用 callable 方式可以巧妙指定顺序, in 后边的是我们要的顺序
pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])
# 默认第一行是表头,可以指定,如果指定列名会被忽略
pd.read_csv(data, header=0)
pd.read_csv(data, header=None) # 没有表头
pd.read_csv(data, names=['列1', '列2']) # 指定列名列表
# 如没列名,自动指定一个: 前缀加序数
pd.read_csv(data, prefix='c_', header=None)
# 读取部分列
pd.read_csv(data, usecols=[0,4,3]) # 按索引只读取指定列,顺序无关
pd.read_csv(data, usecols=['列1', '列5']) # 按索引只读取指定列
# 指定列顺序,其实是 df 的筛选功能
pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']]
pd.read_csv(data, index_col=0) # 第几列是索引
# 以下用 callable 方式可以巧妙指定顺序, in 后边的是我们要的顺序
pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])
数据类型¶
In [ ]:
Copied!
data = 'https://gairuo.com/file/data/dataset/GDP-China.csv'
# 指定数据类型
pd.read_csv(data, dtype=np.float64) # 所有数据均为此数据类型
pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型
# 解析日期时间
pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式
pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析
# 将 1、4 列合并解析成名为 时间的 时间类型列
pd.read_csv(data, parse_dates={'时间':[1,4]})
# 指定时间解析库,默认是 dateutil.parser.parser
pd.read_csv(data, date_parser=pd.io.date_converters.parse_date_time)
date_parser=lambda x: pd.to_datetime(x, utc=True, format=...)
data = 'https://gairuo.com/file/data/dataset/GDP-China.csv'
# 指定数据类型
pd.read_csv(data, dtype=np.float64) # 所有数据均为此数据类型
pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型
# 解析日期时间
pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式
pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析
# 将 1、4 列合并解析成名为 时间的 时间类型列
pd.read_csv(data, parse_dates={'时间':[1,4]})
# 指定时间解析库,默认是 dateutil.parser.parser
pd.read_csv(data, date_parser=pd.io.date_converters.parse_date_time)
date_parser=lambda x: pd.to_datetime(x, utc=True, format=...)
导出文件¶
In [ ]:
Copied!
df.to_csv('done.csv')
df.to_csv('data/done.csv') # 可以指定文件目录路径
df.to_csv('done.csv', index=False) # 不要索引
# 导出二进制文件句柄(缓冲), 支持编码和压缩 pandas 1.2.0 增加
import io
buffer = io.BytesIO()
df.to_csv(buffer, encoding="utf-8", compression="gzip")
# 指定一列导出 txt 格式文件
df.Q1.to_csv('Q1_test.txt', index=None)
df.to_csv('done.csv')
df.to_csv('data/done.csv') # 可以指定文件目录路径
df.to_csv('done.csv', index=False) # 不要索引
# 导出二进制文件句柄(缓冲), 支持编码和压缩 pandas 1.2.0 增加
import io
buffer = io.BytesIO()
df.to_csv(buffer, encoding="utf-8", compression="gzip")
# 指定一列导出 txt 格式文件
df.Q1.to_csv('Q1_test.txt', index=None)
Excel 文件
read_excel() 方法可以使用 xlrd Python 模块(可能需要安装,下同)读取 Excel 2003(.xls)文件。 可以使用 xlrd 或 openpyxl 读取Excel 2007+(.xlsx)文件,强烈建议安装 openpyxl。 可以使用 pyxlsb 读取二进制Excel(.xlsb)文件。 to_excel() 实例方法用于将 DataFrame 保存到 Excel。 大多数用法类似于 csv,包括文件的读取和保存。
In [ ]:
Copied!
xlsx = pd.ExcelFile('data.xlsx')
df = pd.read_excel(xlsx, 'Sheet1') # 读取
xlsx.parse('sheet1') # 取指定标签为 DataFrame
# Excel 的所有标签
xlsx.sheet_names
# ['sheet1', 'sheet2', 'sheet3', 'sheet4']
xlsx = pd.ExcelFile('data.xlsx')
df = pd.read_excel(xlsx, 'Sheet1') # 读取
xlsx.parse('sheet1') # 取指定标签为 DataFrame
# Excel 的所有标签
xlsx.sheet_names
# ['sheet1', 'sheet2', 'sheet3', 'sheet4']
文件读取¶
In [ ]:
Copied!
# Returns a DataFrame
pd.read_excel('team.xlsx') # 默认读取第一个标签页 Sheet
pd.read_excel('path_to_file.xls', sheet_name='Sheet1') # 指定 Sheet
# 从网址 url 读取
pd.read_excel('https://gairuo.com/file/data/dataset/team.xlsx')
# !!! 读取的功能基本与 read_csv 一样,可参考上文
# 不指定索引,不指定表头,使用自动行列索引
pd.read_excel('tmp.xlsx', index_col=None, header=None)
# 指定列的数据类型
pd.read_excel('tmp.xlsx', index_col=0,
dtype={'Name': str, 'Value': float})
# Returns a DataFrame
pd.read_excel('team.xlsx') # 默认读取第一个标签页 Sheet
pd.read_excel('path_to_file.xls', sheet_name='Sheet1') # 指定 Sheet
# 从网址 url 读取
pd.read_excel('https://gairuo.com/file/data/dataset/team.xlsx')
# !!! 读取的功能基本与 read_csv 一样,可参考上文
# 不指定索引,不指定表头,使用自动行列索引
pd.read_excel('tmp.xlsx', index_col=None, header=None)
# 指定列的数据类型
pd.read_excel('tmp.xlsx', index_col=0,
dtype={'Name': str, 'Value': float})
多个 Sheet 的读取¶
In [ ]:
Copied!
pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 'Sheet2'])
pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 'Sheet2'])
导出 excel¶
In [ ]:
Copied!
df.to_excel('path_to_file.xlsx')
# 指定 sheet 名, 不要索引
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', index=False)
# 指定索引名,不合并单元格
df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)
# 将多个 df 分不同 sheet 导入到一个 excel
with pd.ExcelWriter('path_to_file.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')
# 指定操作引擎
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')
# By setting the 'engine' in the ExcelWriter constructor.
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')
df.to_excel(writer)
writer.save()
# 设置系统引擎
from pandas import options # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')
# 保留一位小数
df.to_excel(writer,'Sheet1',float_format = "%0.1f")
df.to_excel('path_to_file.xlsx')
# 指定 sheet 名, 不要索引
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', index=False)
# 指定索引名,不合并单元格
df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)
# 将多个 df 分不同 sheet 导入到一个 excel
with pd.ExcelWriter('path_to_file.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')
# 指定操作引擎
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')
# By setting the 'engine' in the ExcelWriter constructor.
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')
df.to_excel(writer)
writer.save()
# 设置系统引擎
from pandas import options # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')
# 保留一位小数
df.to_excel(writer,'Sheet1',float_format = "%0.1f")

