十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1、首先打開excel表格,在單元格中輸入兩列數(shù)據(jù),需要將這兩列數(shù)據(jù)進(jìn)行比對(duì)相同數(shù)據(jù)。
專業(yè)網(wǎng)絡(luò)公司,專做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!成都創(chuàng)新互聯(lián)公司為您提供品質(zhì)好成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,負(fù)責(zé)任的成都網(wǎng)站制作公司!
2、然后在C1單元格中輸入公式:=VLOOKUP(B1,A:A,1,0),意思是比對(duì)B1單元格中A列中是否有相同數(shù)據(jù)。
3、點(diǎn)擊回車,即可將公式的計(jì)算結(jié)果顯示出來,可以看到C1中顯示的是B1在A列中找到的相同數(shù)據(jù)。
4、將公式向下填充,即可發(fā)現(xiàn)C列中顯示出的數(shù)字即為有相同數(shù)據(jù)的,顯示“#N/A”的為沒有找到匹配數(shù)據(jù)的。
5、將C1-C4中的數(shù)據(jù)進(jìn)行復(fù)制并粘貼成數(shù)值,即可完成相同數(shù)據(jù)的提取操作。
在實(shí)際研究中,我們經(jīng)常需要獲取大量數(shù)據(jù),而這些數(shù)據(jù)很大一部分以pdf表格的形式呈現(xiàn),如公司年報(bào)、發(fā)行上市公告等。面對(duì)如此多的數(shù)據(jù)表格,采用手工復(fù)制黏貼的方式顯然并不可取。那么如何才能高效提取出pdf文件中的表格數(shù)據(jù)呢?
Python提供了許多可用于pdf表格識(shí)別的庫(kù),如camelot、tabula、pdfplumber等。綜合來看,pdfplumber庫(kù)的性能較佳,能提取出完整、且相對(duì)規(guī)范的表格。因此,本推文也主要介紹pdfplumber庫(kù)在pdf表格提取中的作用。
作為一個(gè)強(qiáng)大的pdf文件解析工具,pdfplumber庫(kù)可迅速將pdf文檔轉(zhuǎn)換為易于處理的txt文檔,并輸出pdf文檔的字符、頁面、頁碼等信息,還可進(jìn)行頁面可視化操作。使用pdfplumber庫(kù)前需先安裝,即在cmd命令行中輸入:
pip install pdfplumber
pdfplumber庫(kù)提供了兩種pdf表格提取函數(shù),分別為.extract_tables( )及.extract_table( ),兩種函數(shù)提取結(jié)果存在差異。為進(jìn)行演示,我們網(wǎng)站上下載了一份短期融資券主體信用評(píng)級(jí)報(bào)告,為pdf格式。任意選取某一表格,其界面如下:
接下來,我們簡(jiǎn)要分析兩種提取模式下的結(jié)果差異。
(1).extract_tables( )
可輸出頁面中所有表格,并返回一個(gè)嵌套列表,其結(jié)構(gòu)層次為table→row→cell。此時(shí),頁面上的整個(gè)表格被放入一個(gè)大列表中,原表格中的各行組成該大列表中的各個(gè)子列表。若需輸出單個(gè)外層列表元素,得到的便是由原表格同一行元素構(gòu)成的列表。例如,我們執(zhí)行如下程序:
輸出結(jié)果:
(2).extract_table( )
返回多個(gè)獨(dú)立列表,其結(jié)構(gòu)層次為row→cell。若頁面中存在多個(gè)行數(shù)相同的表格,則默認(rèn)輸出頂部表格;否則,僅輸出行數(shù)最多的一個(gè)表格。此時(shí),表格的每一行都作為一個(gè)單獨(dú)的列表,列表中每個(gè)元素即為原表格的各個(gè)單元格內(nèi)容。若需輸出某個(gè)元素,得到的便是具體的數(shù)值或字符串。如下:
輸出結(jié)果:
在此基礎(chǔ)上,我們?cè)敿?xì)介紹如何從pdf文件中提取表格數(shù)據(jù)。其中一種思路便是將提取出的列表視為一個(gè)字符串,結(jié)合Python的正則表達(dá)式re模塊進(jìn)行字符串處理后,將其保存為以標(biāo)準(zhǔn)英文逗號(hào)分隔、可被Excel識(shí)別的csv格式文件,即進(jìn)行如下操作:
輸出結(jié)果:
盡管能獲得完整的表格數(shù)據(jù),但這種方法相對(duì)不易理解,且在處理結(jié)構(gòu)不規(guī)則的表格時(shí)容易出錯(cuò)。由于通過pdfplumber庫(kù)提取出的表格數(shù)據(jù)為整齊的列表結(jié)構(gòu),且含有數(shù)字、字符串等數(shù)據(jù)類型。因此,我們可調(diào)用pandas庫(kù)下的DataFrame( )函數(shù),將列表轉(zhuǎn)換為可直接輸出至Excel的DataFrame數(shù)據(jù)結(jié)構(gòu)。DataFrame的基本構(gòu)造函數(shù)如下:
DataFrame([data,index, columns])
三個(gè)參數(shù)data、index和columns分別代表創(chuàng)建對(duì)象、行索引和列索引。DataFrame類型可由二維ndarray對(duì)象、列表、字典、元組等創(chuàng)建。本推文中的data即指整個(gè)pdf表格,提取程序如下:
其中,table[1:]表示選定整個(gè)表格進(jìn)行DataFrame對(duì)象創(chuàng)建,columns=table[0]表示將表格第一行元素作為列變量名,且不創(chuàng)建行索引。輸出Excel表格如下:
通過以上簡(jiǎn)單程序,我們便提取出了完整的pdf表格。但需注意的是,面對(duì)不規(guī)則的表格數(shù)據(jù)提取,創(chuàng)建DataFrame對(duì)象的方法依然可能出錯(cuò),在實(shí)際操作中還需進(jìn)行核對(duì)。
關(guān)于我們
微信公眾號(hào)“爬蟲俱樂部”分享實(shí)用的stata命令,歡迎轉(zhuǎn)載、打賞。爬蟲俱樂部是由李春濤教授領(lǐng)導(dǎo)下的研究生及本科生組成的大數(shù)據(jù)分析和數(shù)據(jù)挖掘團(tuán)隊(duì)。
投稿要求:
1)必須原創(chuàng),禁止抄襲;
2)必須準(zhǔn)確,詳細(xì),有例子,有截圖;
【常見的內(nèi)置函數(shù)】
1、enumerate(iterable,start=0)
是python的內(nèi)置函數(shù),是枚舉、列舉的意思,對(duì)于一個(gè)可迭代的(iterable)/可遍歷的對(duì)象(如列表、字符串),enumerate將其組成一個(gè)索引序列,利用它可以同時(shí)獲得索引和值。
2、zip(*iterables,strict=False)
用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同,利用*號(hào)操作符,可以將元組解壓為列表。
3、filter(function,iterable)
filter是將一個(gè)序列進(jìn)行過濾,返回迭代器的對(duì)象,去除不滿足條件的序列。
4、isinstance(object,classinfo)
是用來判斷某一個(gè)變量或者是對(duì)象是不是屬于某種類型的一個(gè)函數(shù),如果參數(shù)object是classinfo的實(shí)例,或者object是classinfo類的子類的一個(gè)實(shí)例,
返回True。如果object不是一個(gè)給定類型的的對(duì)象, 則返回結(jié)果總是False
5、eval(expression[,globals[,locals]])
用來將字符串str當(dāng)成有效的表達(dá)式來求值并返回計(jì)算結(jié)果,表達(dá)式解析參數(shù)expression并作為Python表達(dá)式進(jìn)行求值(從技術(shù)上說是一個(gè)條件列表),采用globals和locals字典作為全局和局部命名空間。
【常用的句式】
1、format字符串格式化
format把字符串當(dāng)成一個(gè)模板,通過傳入的參數(shù)進(jìn)行格式化,非常實(shí)用且強(qiáng)大。
2、連接字符串
常使用+連接兩個(gè)字符串。
3、if...else條件語句
Python條件語句是通過一條或多條語句的執(zhí)行結(jié)果(True或者False)來決定執(zhí)行的代碼塊。其中if...else語句用來執(zhí)行需要判斷的情形。
4、for...in、while循環(huán)語句
循環(huán)語句就是遍歷一個(gè)序列,循環(huán)去執(zhí)行某個(gè)操作,Python中的循環(huán)語句有for和while。
5、import導(dǎo)入其他腳本的功能
有時(shí)需要使用另一個(gè)python文件中的腳本,這其實(shí)很簡(jiǎn)單,就像使用import關(guān)鍵字導(dǎo)入任何模塊一樣。
創(chuàng)建一個(gè)函數(shù)用來計(jì)算三個(gè)數(shù)的和,如下:
下來,我們對(duì)其進(jìn)行調(diào)用:
假設(shè)我們要計(jì)算這個(gè)函數(shù)返回結(jié)果的平均值。那么此時(shí),我們只需將和值除以參數(shù)個(gè)數(shù)即可,那么參數(shù)個(gè)數(shù)怎么獲取呢?你可能會(huì)說:數(shù)一下就知道了。那么假設(shè)此時(shí)有很多的參數(shù),你還去數(shù)嗎?此時(shí),明顯這個(gè)方法是不恰當(dāng)?shù)?,那么有沒有更加方便、高效的方法呢?我們接著往下看。
通過上面這個(gè)例子,我們不但可以獲取參數(shù)個(gè)數(shù),還可以獲取所有變量名以及默認(rèn)返回值。此時(shí),我們只需根據(jù)自己的需求,去應(yīng)用就可以了,那么以上的問題,就自然解決了。
首先是準(zhǔn)備工作,導(dǎo)入需要使用的庫(kù),讀取并創(chuàng)建數(shù)據(jù)表取名為loandata。
?
1
2
3
import numpy as np
import pandas as pd
loandata=pd.DataFrame(pd.read_excel('loan_data.xlsx'))
設(shè)置索引字段
在開始提取數(shù)據(jù)前,先將member_id列設(shè)置為索引字段。然后開始提取數(shù)據(jù)。
?
1
Loandata = loandata.set_index('member_id')
按行提取信息
第一步是按行提取數(shù)據(jù),例如提取某個(gè)用戶的信息。下面使用ix函數(shù)對(duì)member_id為1303503的用戶信息進(jìn)行了提取。
?
1
loandata.ix[1303503]
按列提取信息
第二步是按列提取數(shù)據(jù),例如提取用戶工作年限列的所有信息,下面是具體的代碼和提取結(jié)果,顯示了所有用戶的工作年齡信息。
?
1
loandata.ix[:,'emp_length']
按行與列提取信息
第三步是按行和列提取信息,把前面兩部的查詢條件放在一起,查詢特定用戶的特定信息,下面是查詢member_id為1303503的用戶的emp_length信息。
?
1
loandata.ix[1303503,'emp_length']
在前面的基礎(chǔ)上繼續(xù)增加條件,增加一行同時(shí)查詢兩個(gè)特定用戶的貸款金額信息。具體代碼和查詢結(jié)果如下。結(jié)果中分別列出了兩個(gè)用戶的代碼金額。
?
1
loandata.ix[[1303503,1298717],'loan_amnt']
在前面的代碼后增加sum函數(shù),對(duì)結(jié)果進(jìn)行求和,同樣是查詢兩個(gè)特定用戶的貸款進(jìn)行,下面的結(jié)果中直接給出了貸款金額的匯總值。
?
1
loandata.ix[[1303503,1298717],'loan_amnt'].sum()
除了增加行的查詢條件以外,還可以增加列的查詢條件,下面的代碼中查詢了一個(gè)特定用戶的貸款金額和年收入情況,結(jié)果中分別顯示了這兩個(gè)字段的結(jié)果。
?
1
loandata.ix[1303503,['loan_amnt','annual_inc']]
多個(gè)列的查詢也可以進(jìn)行求和計(jì)算,在前面的代碼后增加sum函數(shù),對(duì)這個(gè)用戶的貸款金額和年收入兩個(gè)字段求和,并顯示出結(jié)果。
?
1
loandata.ix[1303503,['loan_amnt','annual_inc']].sum()