小言_互联网的博客

上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据

291人阅读  评论(0)


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见闻录 - 入门之旅

《深入浅出SQL》问答录

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场