大家好,今天小编来为大家介绍几个Pandas读取数据以及保存数据的方法,毕竟我们很多时候需要读取各种形式的数据,以及将我们需要将所做的统计分析保存成特定的格式。
我们大致会说到的方法有:
read_sql()to_sql()read_clipboard()from_dict()to_dict()to_clipboard()read_json()to_json()read_html()to_html()read_table()read_csv()to_csv()read_excel()to_excel()read_xml()to_xml()read_pickle()to_pickle()read_sql()与to_sql()我们一般读取数据都是从数据库中来读取的,因此可以在read_sql()方法中填入对应的sql语句然后来读取我们想要的数据,
pd.read_sql(sql,con,index_col=None,
coerce_float=True,params=None,
parse_dates=None,
columns=None,chunksize=None)
参数详解如下:
我们用PyMysql这个模块来连接数据库,并且读取数据库当中的数据,首先我们导入所需要的模块,并且建立起与数据库的连接
importpandasaspd
frompymysqlimport*
conn=connect(host='localhost',port=3306,database='database_name',
user='',password='',charset='utf8')
我们简单地写一条SQL命令来读取数据库当中的数据,并且用read_sql()方法来读取数据
sql_cmd="SELECT*FROMtable_name"
df=pd.read_sql(sql_cmd,conn)
df.head()
上面提到read_sql()方法当中parse_dates参数可以对日期格式的数据进行处理,那我们来试一下其作用
sql_cmd_2="SELECT*FROMtest_date"
df_1=pd.read_sql(sql_cmd_2,conn)
df_1.head()
output
numberdate_columns
012021-11-11
122021-10-01
232021-11-10
我们来看一个各个列的数据类型
df_1.info()
output
<class'pandas.core.frame.DataFrame'>
RangeIndex:3entries,0to2
Datacolumns(total2columns):
#ColumnNon-NullCountDtype
----------------------------
0number3non-nullint64
1date_columns3non-nullobject
dtypes:int64(1),object(1)
memoryusage:176.0+bytes
正常默认情况下,date_columns这一列也是被当做是String类型的数据,要是我们通过parse_dates参数将日期解析应用与该列
df_2=pd.read_sql(sql_cmd_2,conn,parse_dates="date_columns")
df_2.info()
output
<class'pandas.core.frame.DataFrame'>
RangeIndex:3entries,0to2
Datacolumns(total2columns):
#ColumnNon-NullCountDtype
----------------------------
0number3non-nullint64
1date_columns3non-nulldatetime64[ns]
dtypes:datetime64[ns](1),int64(1)
memoryusage:176.0bytes
就转换成了相对应的日期格式,当然我们还可以采用上面提到的另外一种格式
parse_dates={"date_column":{"format":"%d/%m/%y"}})
to_sql()方法我们来看一下to_sql()方法,作用是将DataFrame当中的数据存放到数据库当中,请看下面的示例代码,我们创建一个基于内存的SQLite数据库
fromsqlalchemyimportcreate_engine
engine=create_engine('sqlite://',echo=False)
然后我们创建一个用于测试的数据集,并且存放到该数据库当中,
df=pd.DataFrame({'num':[1,3,5]})
df.to_sql('nums',con=engine)
查看一下是否存取成功了
engine.execute("SELECT*FROMnums").fetchall()
output
[(0,1),(1,3),(2,5)]
我们可以尝试着往里面添加数据
df2=pd.DataFrame({'num':[7,9,11]})
df2.to_sql('nums',con=engine,if_exists='append')
engine.execute("SELECT*FROMnums").fetchall()
output
[(0,1),(1,3),(2,5),(0,7),(1,9),(2,11)]
注意到上面的if_exists参数上面填的是append,意味着添加新数据进去,当然我们也可以将原有的数据替换掉,将append替换成replace
df2.to_sql('nums',con=engine,if_exists='replace')
engine.execute("SELECT*FROMnums").fetchall()
output
[(0,7),(1,9),(2,11)]
from_dict()方法和to_dict()方法有时候我们的数据是以字典的形式存储的,有对应的键值对,我们如何根据字典当中的数据来创立DataFrame,假设
a_dict={
'学校':'清华大学',
'地理位置':'北京',
'排名':1
}
一种方法是调用json_normalize()方法,代码如下
df=pd.json_normalize(a_dict)
output
学校地理位置排名
0清华大学北京1
当然我们直接调用pd.DataFrame()方法也是可以的
df=pd.DataFrame(json_list,index=[0])
output
学校地理位置排名
0清华大学北京1
当然我们还可以用from_dict()方法,代码如下
df=pd.DataFrame.from_dict(a_dict,orient='index').T
output
学校地理位置排名
0清华大学北京1
这里最值得注意的是orient参数,用来指定字典当中的键是用来做行索引还是列索引,请看下面两个例子
data={'col_1':[1,2,3,4],
'col_2':['A','B','C','D']}
我们将orient参数设置为columns,将当中的键当做是列名
df=pd.DataFrame.from_dict(data,orient='columns')
output
col_1col_2
01A
12B
23C
34D
当然我们也可以将其作为是行索引,将orient设置为是index
df=pd.DataFrame.from_dict(data,orient='index')
output
0123
col_11234
col_2ABCD
to_dict()方法语法如下:
df.to_dict(orient='dict')
针对orient参数,一般可以填这几种形式
一种是默认的dict,代码如下
df=pd.DataFrame({'shape':['square','circle','triangle'],
'degrees':[360,360,180],
'sides':[4,5,3]})
df.to_dict(orient='dict')
output
{'shape':{0:'square',1:'circle',2:'triangle'},'degrees':{0:360,1:360,2:180},'sides':{0:4,1:5,2:3}}
也可以是list,代码如下
df.to_dict(orient='list')
output
{'shape':['square','circle','triangle'],'degrees':[360,360,180],'sides':[4,5,3]}
除此之外,还有split,代码如下
df.to_dict(orient='split')
output
{'index':[0,1,2],'columns':['shape','degrees','sides'],'data':[['square',360,4],['circle',360,5],['triangle',180,3]]}
还有records,代码如下
df.to_dict(orient='records')
output
[{'shape':'square','degrees':360,'sides':4},{'shape':'circle','degrees':360,'sides':5},{'shape':'triangle','degrees':180,'sides':3}]
最后一种是index,代码如下
df.to_dict(orient='indx')
output
{0:{'shape':'square','degrees':360,'sides':4},1:{'shape':'circle','degrees':360,'sides':5},2:{'shape':'triangle','degrees':180,'sides':3}}
read_json()方法和to_json()方法我们经常也会在实际工作与学习当中遇到需要去处理JSON格式数据的情况,我们用Pandas模块当中的read_json()方法来进行处理,我们来看一下该方法中常用到的参数
orient:对应JSON字符串的格式主要有
split: 格式类似于:{index: [index], columns: [columns], data: [values]}例如我们的JSON字符串长这样
a='{"index":[1,2,3],"columns":["a","b"],"data":[[1,3],[2,8],[3,9]]}'
df=pd.read_json(a,orient='split')
output
ab
113
228
339
records: 格式类似于:[{column: value}, ... , {column: value}]例如我们的JSON字符串长这样
a='[{"name":"Tom","age":"18"},{"name":"Amy","age":"20"},{"name":"John","age":"17"}]'
df_1=pd.read_json(a,orient='records')
output
nameage
0Tom18
1Amy20
2John17
index: 格式类似于:{index: {column: value}}例如我们的JSON字符串长这样
a='{"index_1":{"name":"John","age":20},"index_2":{"name":"Tom","age":30},"index_3":{"name":"Jason","age":50}}'
df_1=pd.read_json(a,orient='index')
output
nameage
index_1John20
index_2Tom30
index_3Jason50
columns: 格式类似于:{column: {index: value}}我们要是将上面的index变成columns,就变成
df_1=pd.read_json(a,orient='columns')
output
index_1index_2index_3
nameJohnTomJason
age203050
values: 数组例如我们的JSON字符串长这样
v='[["a",1],["b",2],["c",3]]'
df_1=pd.read_json(v,orient="values")
output
01
0a1
1b2
2c3
to_json()方法将DataFrame数据对象输出成JSON字符串,可以使用to_json()方法来实现,其中orient参数可以输出不同格式的字符串,用法和上面的大致相同,这里就不做过多的赘述
read_html()方法to_html()方法有时候我们需要抓取网页上面的一个表格信息,相比较使用Xpath或者是Beautifulsoup,我们可以使用pandas当中已经封装好的函数read_html来快速地进行获取,例如我们通过它来抓取菜鸟教程Python网站上面的一部分内容
url="https://www.runoob.com/python/python-exceptions.html"
dfs=pd.read_html(url,header=None,encoding='utf-8')
返回的是一个list的DataFrame对象
df=dfs[0]
df.head()
output
异常名称描述
0NaNNaN
1BaseException所有异常的基类
2SystemExit解释器请求退出
3KeyboardInterrupt用户中断执行(通常是输入^C)
4Exception常规错误的基类
当然read_html()方法也支持读取HTML形式的表格,我们先来生成一个类似这样的表格,通过to_html()方法
df=pd.DataFrame(np.random.randn(3,3))
df.to_html("test_1.html")
当然这个HTML形式的表格长这个样子
然后我们再通过read_html方法读取该文件,
dfs=pd.read_html("test_1.html")
dfs[0]
read_csv()方法和to_csv()方法read_csv()方法read_csv()方法是最常被用到的pandas读取数据的方法之一,其中我们经常用到的参数有
pd.read_csv('data.csv')
output
num1num2num3num4
01234
161279
211131518
312101618
也可以是URL,如果访问该URL会返回一个文件的话
pd.read_csv("http://...../..../data.csv")
csv文件时指定的分隔符,默认为逗号,需要注意的是:“csv文件的分隔符”要和“我们读取csv文件时指定的分隔符”保持一致假设我们的数据集,csv文件当中的分隔符从逗号改成了"\t",需要将sep参数也做相应的设定
pd.read_csv('data.csv',sep='\t')
DataFrame的索引pd.read_csv('data.csv',index_col="num1")
output
num2num3num4
num1
1234
61279
11131518
12101618
除了指定单个列,我们还可以指定多个列,例如
df=pd.read_csv("data.csv",index_col=["num1","num2"])
output
num3num4
num1num2
1234
61279
11131518
12101618
pd.read_csv('data.csv',usecols=["列名1","列名2",....])
output
num1num2
012
1612
21113
31210
除了指定列名之外,也可以通过索引来选择想要的列,示例代码如下
df=pd.read_csv("data.csv",usecols=[0,1,2])
output
num1num2num3
0123
16127
2111315
3121016
另外usecols参数还有一个比较好玩的地方在于它能够接收一个函数,将列名作为参数传递到该函数中调用,要是满足条件的,就选中该列,反之则不选择该列
#选择列名的长度大于4的列
pd.read_csv('girl.csv',usecols=lambdax:len(x)>4)
df=pd.read_csv("data.csv",header=None)
output
0123
0num1num2num3num4
11234
261279
311131518
412101618
如果我们将header设为None,pandas则会自动生成表头0, 1, 2, 3..., 然后我们设置prefix参数为表头添加前缀
df=pd.read_csv("data.csv",prefix="test_",header=None)
output
test_0test_1test_2test_3
0num1num2num3num4
11234
261279
311131518
412101618
代码如下:
df=pd.read_csv("data.csv",skiprows=[0,1])
output
61279
011131518
112101618
上面的代码过滤掉了前两行的数据,直接将第三行与第四行的数据输出,当然我们也可以看到第二行的数据被当成是了表头
代码如下:
df=pd.read_csv("data.csv",nrows=2)
output
num1num2num3num4
01234
161279
to_csv()方法该方法主要是用于将DataFrame写入csv文件当中,示例代码如下
df.to_csv("文件名.csv",index=False)
我们还能够输出到zip文件的格式,代码如下
df=pd.read_csv("data.csv")
compression_opts=dict(method='zip',
archive_name='output.csv')
df.to_csv('output.zip',index=False,
compression=compression_opts)
read_excel()方法和to_excel()方法read_excel()方法要是我们的数据是存放在excel当中就可以使用read_excel()方法,该方法中的参数和上面提到的read_csv()方法相差不多,这里就不做过多的赘述,我们直接来看代码
df=pd.read_excel("test.xlsx")
df=pd.read_excel("test.xlsx",dtype={'Name':str,'Value':float})
output
NameValue
0name11.0
1name22.0
2name33.0
3name44.0
excel当中的哪一个sheet当中的数据加以设定df=pd.read_excel("test.xlsx",sheet_name="Sheet3")
output
NameValue
0name110
1name210
2name320
3name430
当然我们要是想一次性读取多个Sheet当中的数据也是可以的,最后返回的数据是以dict形式返回的
df=pd.read_excel("test.xlsx",sheet_name=["Sheet1","Sheet3"])
output
{'Sheet1':NameValue
0name11
1name22
2name33
3name44,'Sheet3':NameValue
0name110
1name210
2name320
3name430}
例如我们只想要Sheet1的数据,可以这么来做
df1.get("Sheet1")
output
NameValue
0name11
1name22
2name33
3name44
to_excel()方法将DataFrame对象写入Excel表格,除此之外还有ExcelWriter()方法也有着异曲同工的作用,代码如下
df1=pd.DataFrame([['A','B'],['C','D']],
index=['Row1','Row2'],
columns=['Col1','Col2'])
df1.to_excel("output.xlsx")
当然我们还可以指定Sheet的名称
df1.to_excel("output.xlsx",sheet_name='Sheet_Name_1_1_1')
有时候我们需要将多个DataFrame数据集输出到一个Excel当中的不同的Sheet当中
df2=df1.copy()
withpd.ExcelWriter('output.xlsx')aswriter:
df1.to_excel(writer,sheet_name='Sheet_name_1_1_1')
df2.to_excel(writer,sheet_name='Sheet_name_2_2_2')
我们还可以在现有的Sheet的基础之上,再添加一个Sheet
df3=df1.copy()
withpd.ExcelWriter('output.xlsx',mode="a",engine="openpyxl")aswriter:
df3.to_excel(writer,sheet_name='Sheet_name_3_3_3')
我们可以生成至Excel文件并且进行压缩包处理
withzipfile.ZipFile("output_excel.zip","w")aszf:
withzf.open("output_excel.xlsx","w")asbuffer:
withpd.ExcelWriter(buffer)aswriter:
df1.to_excel(writer)
对于日期格式或者是日期时间格式的数据,也能够进行相应的处理
fromdatetimeimportdate,datetime
df=pd.DataFrame(
[
[date(2019,1,10),date(2021,11,24)],
[datetime(2019,1,10,23,33,4),datetime(2021,10,20,13,5,13)],
],
index=["Date","Datetime"],
columns=["X","Y"],
)
withpd.ExcelWriter(
"output_excel_date.xlsx",
date_format="YYYY-MM-DD",
datetime_format="YYYY-MM-DDHH:MM:SS"
)aswriter:
df.to_excel(writer)
read_table()方法对于txt文件,既可以用read_csv()方法来读取,也可以用read_table()方法来读取,其中的参数和read_csv()当中的参数大致相同,这里也就不做过多的赘述
df=pd.read_table("test.txt",names=["col1","col2"],sep='')
output
col1col2
012
134
256
378
4910
51112
我们要读取的txt文件当中的数据是以空格隔开的,因此再sep参数上面需要设置成空格
Python当中的Pickle模块实现了对一个Python对象结构的二进制序列和反序列化,序列化过程是将文本信息转变为二进制数据流,同时保存数据类型。例如数据处理过程中,突然有事儿要离开,可以直接将数据序列化到本地,这时候处理中的数据是什么类型,保存到本地也是同样的类型,反序列化之后同样也是该数据类型,而不是从头开始处理
to_pickle()方法我们先将DataFrame数据集生成pickle文件,对数据进行永久储存,代码如下
df1.to_pickle("test.pkl")
read_pickle()方法代码如下
df2=pd.read_pickle("test.pkl")
read_xml()方法和to_xml()方法XML指的是可扩展标记语言,和JSON类似也是用来存储和传输数据的,还可以用作配置文件
XML和HTML为不同的目的而设计的
对XML最好的理解是独立于软件和硬件的信息传输工具,我们先通过to_xml()方法生成XML数据
df=pd.DataFrame({'shape':['square','circle','triangle'],
'degrees':[360,360,180],
'sides':[4,np.nan,3]})
df.to_xml("test.xml")
我们用pandas中的read_xml()方法来读取数据
df=pd.read_xml("test.xml")
output
shapedegreessides
0square3604.0
1circle360NaN
2triangle1803.0
read_clipboard()方法有时候数据获取不太方便,我们可以通过复制的方式,通过Pandas当中的read_clipboard()方法来读取复制成功的数据,例如我们选中一部分数据,然后复制,运行下面的代码
df_1=pd.read_clipboard()
output
num1num2num3num4
01234
161279
211131518
312101618
to_clipboard()方法有复制就会有粘贴,我们可以将DataFrame数据集输出至剪贴板中,粘贴到例如Excel表格中
df.to_clipboard()
分享
点收藏
点点赞
点在看
文章转发自AI科技大本营微信公众号,版权归其所有。文章内容不代表本站立场和任何投资暗示。
Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM