pandas IO概述
关于pandas的IO,绝不止我之前写的那些,但是其他的格式我也没见过,所以就不写其他的了。
大体上有以下格式支持:
读取文件
读取csv文件
这里主讲read_csv
函数,但是又不仅仅简单的讲一下read_csv
函数。
先来看一下函数原型:
def read_csv(filepath_or_buffer: PathLike[str], # 文件名字
sep: Any = lib.no_default, # 来自定义字段之间的分隔符
header: str = "infer",
#当选择默认值或header=0时,将首行设为列名。如果列名被传入明确值就令header=None。注意,当header=0时,即使列名被传参也会被覆盖。
names: Any = None, # 列名列表的使用. 如果文件不包含列名,那么应该设置header=None。 列名列表中不允许有重复值.
index_col: Any = None,
# DataFrame的行索引列表, 既可以是字符串名称也可以是列索引. 如果传入一个字符串序列或者整数序列,那么一定要使用多级索引(MultiIndex).
# 注意: 当index_col=False ,pandas不再使用首列作为索引。
usecols: Any = None, # 返回列名列表的子集.
dtype: Any = None, # 指定某列或整体数据的数据类型. E.g. {'a': np.float64, 'b': np.int32} (不支持 engine='python').
)
#这里提供了常用参数,不代表只有这些参数
来几个示例:
import pandas as pd
df = pd.read_csv('test.csv')
print(df.head(7)) # 默认是5行,可以人为指定
结果:
a b
0 1.0 2
1 3.0 4
2 NaN 5
import pandas as pd
df = pd.read_csv('test.csv',header=1) # 指定csv文件第一行为列名称
print(df.head(7)) # 默认是5行,可以认为指定
结果:
1 2
0 3.0 4
1 NaN 5
import pandas as pd
df = pd.read_csv('test.csv',names = [1,2,3,4,5]) # 指定列名称
print(df.head(7))
1 2 3 4 5
0 a b NaN NaN NaN
1 1 2 NaN NaN NaN
2 3 4 NaN NaN NaN
3 NaN 5 NaN NaN NaN
指定的列名称是从右往左排的,列名一定要起全,不然会有几页无法调用了。
import pandas as pd
df = pd.read_csv('test.csv',header = 0,names = ['a','b'],usecols=['a']) # 返回指定列
print(df.head())
a
0 1.0
1 3.0
2 NaN
import pandas as pd
df = pd.read_csv('test.csv')
print(df.dtypes) #查看列类型
a float64
b int64
dtype: object
修改列类型:
import pandas as pd
df = pd.read_csv('test.csv',dtype={
'b':object}) #修改列类型
print(df.dtypes) #查看列类型
a float64
b object
dtype: object
从 StringIO 对象中读取数据
from io import StringIO
data = "name|age|birth|sex~Tom|18.0|2000-02-10|~Bob|30.0|1988-10-17|male"
df = pd.read_csv(StringIO(data), sep="|", lineterminator="~")
print(df.head())
name age birth sex
0 Tom 18.0 2000-02-10 NaN
1 Bob 30.0 1988-10-17 male
小插曲:中文报错SyntaxError: Non-UTF-8 code starting with ‘\xe6’ in file
代码最上面加上编码格式:
#coding:utf-8
读取json文件
def read_json(path_or_buf: Any = None, # 文件路径,或网址
orient: str = None, # 预期的json格式
lines: bool = False, # 按行解析json文件
)
关于json,我就不想讲太多啦,能读能写就好啦,感觉也不会用得到吧。
以records格式读取JSON文件:
读取Excel文件
read_excel(io,sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None,usecols=None)
参数释义:
io:Excel路径
sheetname:指定工作表名或编号,编号从0开始
skiprows : 省略指定行数的数据
skip_footer :省略从尾部数的int行数据
index_col : 指定列为索引列
废话不多说,直接演示
实操
import pandas as pd
xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file).head(5)
print(df)
注意:如果说xlrd版本太高,请调低。
然后运行出来:
上映日期 片名 总票房
0 2019 柬爱 9.63W
1 2019 那座桥 6.05W
2 2019 决战中途岛 2.92Y
3 2019 小巷管家 2433.22W
4 2019 功夫小镇 16.97W
读取指定工作表
import pandas as pd
xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作').head(5) #指定读取工作表
print(df)
上映日期 片名 总票房
0 2019 功夫小镇 16.97W
1 2019 越域重生 6.55W
2 2019 终结者:黑暗命运 3.51Y
3 2019 杨靖宇 127.81W
4 2019 二凤 61.22W
指定列名称
import pandas as pd
xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作',header=1).head(5) #指定列名称
print(df)
2019 功夫小镇 16.97W
0 2019 越域重生 6.55W
1 2019 终结者:黑暗命运 3.51Y
2 2019 杨靖宇 127.81W
3 2019 二凤 61.22W
4 2019 双子杀手 2.32Y
读取指定列
import pandas as pd
xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作',usecols=['片名','总票房']).head(5) #指定列名称
print(df)
你要那个列不存在,是会报错的
片名 总票房
0 功夫小镇 16.97W
1 越域重生 6.55W
2 终结者:黑暗命运 3.51Y
3 杨靖宇 127.81W
4 二凤 61.22W
ExcelFile 类
为了更方便地读取同一个文件的多张表格,ExcelFile类可用来打包文件并传递给read_excel。因为仅需读取一次内存,所以这种方式读取一个文件的多张表格会有性能上的优势。
xlsx = pd.ExcelFile('path_to_file.xls')
df = pd.read_excel(xlsx, 'Sheet1')
with pd.ExcelFile('path_to_file.xls') as xls:
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')
解析日期
当读取excel文件的时候,像日期时间的值通常会自动转换为恰当的dtype(数据类型)。但是如果你有一列字符串看起来很像日期(实际上并不是excel里面的日期格式),那么你就能使用parse_dates方法来解析这些字符串为日期:
pd.read_excel('path_to_file.xls', 'Sheet1', parse_dates=['date_strings'])
单元格转换
Excel里面的单元格内容是可以通过converters方法来进行转换的。例如,把一列转换为布尔值:
pd.read_excel('path_to_file.xls', 'Sheet1', converters={
'MyBools': bool})
一列含有缺失值的整数是不能转换为具有整数dtype的数组,因为NaN严格的被认为是浮点数。你能够手动地标记缺失数据为恢复整数dtype:
def cfun(x):
return int(x) if x else -1
pd.read_excel('path_to_file.xls', 'Sheet1', converters={
'MyInts': cfun})
读取MySQL的数据库文件
这里需要一定的MySQL功底,如果不熟悉的话,建议先移步:MySQL见闻录 - 入门之旅
read其实就是两个函数的壳:
read_sql_query:通过一个SQL语句读取数据
read_sql_table:读取数据库中的一个表(table)
pandas.read_sql(sql, con, index_col=None,columns=None)
参数释义:
sql:表名、SQL语句
con:建立连接
index_col:索引列
测试
环境配置:
首先你需要有安装MySQL环境,这些在这里都不多说,上面那篇MySQL入门之旅很详细。
整完之后,开个户:
from sqlalchemy import create_engine
import pandas as pd
# mysql+pymysql://用户名:密码@服务器IP/数据库名
engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')
# 我这里又换新人了
print(engine.execute('show tables').fetchall())
# 配置引擎,并确定引擎可用
除了代码中的那个包,还要安装两个包。
pymysql和cryctography、
[('presidents',)]
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')
print(pd.read_sql('presidents',con=engine))
表里面什么都没有,自然什么都读不出来了。
Empty DataFrame
Columns: [last_name, first_name]
Index: []
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')
#print(pd.read_sql('presidents',con=engine,index_col='first_name')) # 使用索引列
pd.read_sql('select * from presidents',con=engine) # 直接使用SQL语句
由于表中没有数据,所以什么也读不出来。
转载:https://blog.csdn.net/qq_43762191/article/details/115460511