数据结构化——pandas库

通过pandas库可以爬取网页中的表格数据,对数据进行结构化处理,并导出Excel工作簿。

read_html()爬取网页表格数据:

import pandas as pd
url='http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/dzjy/index.phtml'
table=pd.read_html(url)[0]
table #这是Jupyter Notebook中打印输出变量的方法

动态渲染出来的不能用read_html()函数以访问网址的方式爬取数据,而是需要先用Selenium库获取网页源代码,再用read_html()函数解析网页源代码,提取表格数据。

DataFrame:

DataFrame是pandas库用于组织和管理数据的一种二维表格数据结构,可以看做一个Excel工作表。

可通过列表创建和通过字典创建:

(1)通过列表创建

第一种方法:

import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]])

第二种方法:自定义列索引和行索引

a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['a','b','c'])

通过DataFrame的colunms属性可以查看和修改列索引:

print(a.columns) #查看列索引

a.columns=['日期','分数'] #修改列索引

无需知道数据的具体数量,直接将列表拼接成列:

a=pd.DataFrame() #创建一个空DataFrame,用于存储之后要拼接的列数据
date=[1,3,5]
score=[2,4,6]
a['date']=date
a['score']=score

(2)通过字典创建DataFrame

b=pd.DataFrame({'date':[1,3,5],'score':[2,4,6]})

数据文件的读取和写入:

(1)文件读取

用read_excel()函数读取Excel工作簿的数据:

import pandas as pd
data=pd.read_excel('data.xlsx',sheet_name=0) 
#data为DataFrame结构,参数sheet_name用于指定要读取的工作表,其值可以是工作表名称,也可以是数字(默认为0,即第1个工作表)

CSV文件本质上是一个文本文件,可以用Excel或文本编辑器打开。

CSV文件中存储的是用逗号分隔的数据,但不包含格式、公式、宏等。

用read_csv()函数读取CSV文件中的数据。

data=pd.read_csv('data.csv',delimiter=',',encoding='utf-8')
#delimiter用于指定数据的分隔符,默认为逗号,encoding用于设置编码格式

(2)文件写入

to_excel()函数可以将DataFrame中的数据写入Excel工作簿:

data=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列'])
data.to_excel('data_news.xlsx',index=False)
#这里使用相对路径,index设置为True表示保留行索引信息

DataFrame中数据的常用操作:

(1)按列选取数据

#返回不包含列索引信息的一维格式的数据
a=data['c1']

#返回包含包含列索引信息的二维格式数据
b=data[['c1']]

#返回多列,需要在中括号中以列表的形式给出列索引值
c=data[['c1','c3']]

(2)按行选取数据

#选取第2行和第3行的数据,注意序号从0开始,左闭右开,选取单行必须使用iloc方法
a=data.iloc[1:3]

#还可使用loc方法根据行索引选取数
d=data.loc[['r2','r3']]

#如果行数很多,可以用head()函数选取前5行数据
e=data.head(5)

(3)按区块选取数据

按区块选取是指选取某几行的某几列数据。

a=data[['c1','c3']][0:2]
#也可以写成data[0:2][['c1','c3']]

#用iloc方法选取行,再选取列
b=data.iloc[0:2][['c1','c3']]

#选取c3列第1行的数据
c=data.iloc[0]['c3']
不能写成data['c3'][0]或data[0]['c3']

(4)数据筛选

通过在中括号里设置条件可以对行数据进行筛选。

#选取c1列中数字大于1的行
a=data[data['c1']>1]

如果有多个筛选条件,可用&(表示“且”)或| (表示“或”)连接。

#筛选c1列中数字大于1且c2列中数字等于5的行
b=data[(data['c1']>1)&(data['c2']==5)]

(5)数据整体情况查看

通过DataFrame的shape属性可以获取表格的行数和列数:data.shape

(6)数据运算

可以通过数据运算利用已有的列创建新的一列:

data['c4']=data['c3']-data['c1']
data.head()
#data.head()会输出所有行

(7)数据排序

用sort_values()函数可以将数据按列排序

#按c2列进行降序排序
a=data.sort_values(by='c2',ascending=False)
ascending默认为True,表示升序排列,by用于指定按哪一列来排序

(8)数据删除

用drop()函数可以删除指定的列或行

DataFrame.drop(index=None,columns=None,inplace=False)
index用于指定要删除的行,columns用于指定要删除的列
inpalce默认为False,表示该删除操作不改变原DataFrame,而是返回一个执行删除操作后的新DataFrame

用drop_duplicates()函数可以删除内容重复的行

用dropna()函数可以删除空行(含有空值的行),可以用参数thresh来限定非空值的个数

示例:

#先导入selenium库,然后访问网址,获取网页源代码
from selenium import webdriver
browser=webdriver.Chrome()
url='http://vip.stock.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/600519/displaytype/4.phtml'
browser.get(url)
data=browser.page_source

#导入pandas库,用read_html()函数解析网页源代码,提取表格数据
import pandas as pd
table=pd.read_html(data)

#通过for循环语句遍历列表table,然后依次打印出各个表格的序号和内容
for i in range(len(table)):
    print(i)
    print(table[i])
df=table[14]
df  #在Jupyter Notebook中打印输出

df.columns=df.iloc[0] #设置列索引为原表格的第一行
df=df[1:] #从第2行开始选取数据
df=df.dropna() #删除含有空值的行,若只想删除全为空值的行,可写成dropna(how='all')
df  #在Jupyter Notebook中打印输出

df.to_excel('1.xlsx',index=False)  #将数据导出为Excel工作簿,设置index=False以忽略行索引

从网页上爬取的文本数据转换为结构性的数据表格,并导出为Excel工作簿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值