深入理解pandas讀取excel,txt,csv文件等命令


pandas讀取文件官方提供的文檔

在使用pandas讀取文件之前,必備的內容,必然屬於官方文檔,官方文檔查閱地址

http://pandas.pydata.org/pandas-docs/version/0.24/reference/io.html

文檔操作屬於pandas里面的Input/Output也就是IO操作,基本的API都在上述網址,接下來本文核心帶你理解部分常用的命令

pandas讀取txt文件

讀取txt文件需要確定txt文件是否符合基本的格式,也就是是否存在\t, ,,等特殊的分隔符
一般txt文件長成這個樣子

txt文件舉例

下面的文件為空格間隔

1 2019-03-22 00:06:24.4463094 中文測試 
2 2019-03-22 00:06:32.4565680 需要編輯encoding 
3 2019-03-22 00:06:32.6835965 ashshsh 
4 2017-03-22 00:06:32.8041945 eggg

讀取命令采用 read_csv或者 read_table都可以

import pandas as pd
df =  pd.read_table("./test.txt")
print(df)

import pandas as pd
df =  pd.read_csv("./test.txt")
print(df)

但是,注意,這個地方讀取出來的數據內容為3行1列的DataFrame類型,並沒有按照我們的要求得到3行4列

import pandas as pd
df =  pd.read_csv("./test.txt")
print(type(df))
print(df.shape)

<class 'pandas.core.frame.DataFrame'>
(3, 1)

read_csv函數

默認: 從文件、URL、文件新對象中加載帶有分隔符的數據,默認分隔符是逗號。

上述txt文檔並沒有逗號分隔,所以在讀取的時候需要增加sep分隔符參數

df =  pd.read_csv("./test.txt",sep=' ')

參數說明,官方Source : https://github.com/pandas-dev/pandas/blob/v0.24.0/pandas/io/parsers.py#L531-L697

中文說明以及重點功能案例

參數 中文釋義
filepath_or_buffer 可以是URL,可用URL類型包括:http, ftp, s3和文件,本地文件讀取實例:file://localhost/path/to/table.csv
sep str類型,默認',' 指定分隔符。如果不指定參數,則會嘗試使用默認值逗號分隔。分隔符長於一個字符並且不是‘\s+’,將使用python的語法分析器。並且忽略數據中的逗號。正則表達式例子:'\r\t'
delimiter 定界符,備選分隔符(如果指定該參數,則sep參數失效) 一般不用
delimiter_whitespace True or False 默認False, 用空格作為分隔符等價於spe=’\s+’如果該參數被調用,則delimite不會起作用
header 指定第幾行作為列名(忽略注解行),如果沒有指定列名,默認header=0; 如果指定了列名header=None
names 指定列名,如果文件中不包含header的行,應該顯性表示header=None ,header可以是一個整數的列表,如[0,1,3]。未指定的中間行將被刪除(例如,跳過此示例中的2行)
index_col(案例1) 默認為None 用列名作為DataFrame的行標簽,如果給出序列,則使用MultiIndex。如果讀取某文件,該文件每行末尾都有帶分隔符,考慮使用index_col=False使panadas不用第一列作為行的名稱。
usecols 默認None 可以使用列序列也可以使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’] ,使用這個參數可以加快加載速度並降低內存消耗。
squeeze 默認為False, True的情況下返回的類型為Series,如果數據經解析后僅含一行,則返回Series
prefix 自動生成的列名編號的前綴,如: ‘X’ for X0, X1, ... 當header =None 或者沒有設置header的時候有效
mangle_dupe_cols 默認為True,重復的列將被指定為’X.0’…’X.N’,而不是’X’…’X’。如果傳入False,當列中存在重復名稱,則會導致數據被覆蓋。
dtype 例子: {‘a’: np.float64, ‘b’: np.int32} 指定每一列的數據類型,a,b表示列名
engine 使用的分析引擎。可以選擇C或者是python,C引擎快但是Python引擎功能更多一些
converters(案例2) 設置指定列的處理函數,可以用"序號"也可以使用“列名”進行列的指定
true_values / false_values 沒有找到實際的應用場景,備注一下,后期完善
skipinitialspace 忽略分隔符后的空格,默認false
skiprows 默認值 None 需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始)
skipfooter 從文件尾部開始忽略。 (c引擎不支持)
nrows 從文件中只讀取多少數據行,需要讀取的行數(從文件頭開始算起)
na_values 空值定義,默認情況下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表現為NAN
keep_default_na 如果指定na_values參數,並且keep_default_na=False,那么默認的NaN將被覆蓋,否則添加
na_filter 是否檢查丟失值(空字符串或者是空值)。對於大文件來說數據集中沒有N/A空值,使用na_filter=False可以提升讀取速度
verbose 是否打印各種解析器的輸出信息,例如:“非數值列中缺失值的數量”等。
skip_blank_lines 如果為True,則跳過空行;否則記為NaN。
parse_dates 有如下的操作
1. boolean. True -> 解析索引
2. list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作為獨立的日期列;
3. list of lists. e.g. If [[1, 3]] -> 合並1,3列作為一個日期列使用
4. dict, e.g. {‘foo’ : [1, 3]} -> 將1,3列合並,並給合並后的列起名為"foo"
infer_datetime_format 如果設定為True並且parse_dates 可用,那么pandas將嘗試轉換為日期類型,如果可以轉換,轉換方法並解析。在某些情況下會快5~10倍
keep_date_col 如果連接多列解析日期,則保持參與連接的列。默認為False
date_parser 用於解析日期的函數,默認使用dateutil.parser.parser來做轉換。Pandas嘗試使用三種不同的方式解析,如果遇到問題則使用下一種方式。
1.使用一個或者多個arrays(由parse_dates指定)作為參數;
2.連接指定多列字符串作為一個列作為參數;
3.每行調用一次date_parser函數來解析一個或者多個字符串(由parse_dates指定)作為參數。
dayfirst DD/MM格式的日期類型
iterator 返回一個TextFileReader 對象,以便逐塊處理文件。
chunksize 文件塊的大小
compression 直接使用磁盤上的壓縮文件。如果使用infer參數,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些為后綴的文件,否則不解壓。如果使用zip,那么ZIP包中國必須只包含一個文件。設置為None則不解壓。
新版本0.18.1版本支持zip和xz解壓
thousands 千分位符號,默認‘,’
decimal 小數點符號,默認‘.’
lineterminator 行分割符,只在C解析器下使用
quotechar 引號,用作標識開始和解釋的字符,引號內的分割符將被忽略
quoting 控制csv中的引號常量。可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote 雙引號,當單引號已經被定義,並且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素作為一個元素使用。
escapechar 當quoting 為QUOTE_NONE時,指定一個字符使的不受分隔符限值。
comment 標識着多余的行不被解析。如果該字符出現在行首,這一行將被全部忽略。這個參數只能是一個字符,空行(就像skip_blank_lines=True)注釋行被header和skiprows忽略一樣。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回結果將是以’a,b,c'作為header
encoding 編碼方式,指定字符集類型,通常指定為'utf-8'
dialect 如果沒有指定特定的語言,如果sep大於一個字符則忽略。具體查看csv.Dialect 文檔
error_bad_lines 如果一行包含太多的列,那么默認不會返回DataFrame ,如果設置成false,那么會將改行剔除(只能在C解析器下使用)
warn_bad_lines 如果error_bad_lines =False,並且warn_bad_lines =True 那么所有的“bad lines”將會被輸出(只能在C解析器下使用)
low_memory 分塊加載到內存,再低內存消耗中解析。但是可能出現類型混淆。確保類型不被混淆需要設置為False。或者使用dtype 參數指定類型。注意使用chunksize 或者iterator 參數分塊讀入會將整個文件讀入到一個Dataframe,而忽略類型(只能在C解析器中有效)
delim_whitespace New in version 0.18.1: Python解析器中有效
memory_map 如果為filepath_or_buffer提供了文件路徑,則將文件對象直接映射到內存上,並直接從那里訪問數據。使用此選項可以提高性能,因為不再有任何I / O開銷,使用這種方式可以避免文件再次進行IO操作
float_precision 指定C引擎應用於浮點值的轉換器

該表格部分參考 博客 https://www.cnblogs.com/datablog/p/6127000.html 感謝博主的翻譯,O(∩_∩)O哈哈~

案例1

index_col 使用
首先准備一個txt文件,這個文件最大的問題是在每行的末尾多了一個',' ,按照提示解釋為,如果每行末尾都有分隔符,會出現問題,但是在實際測試的時候發現需要配合names參數,才可以出現效果

goof,1,2,3,ddd,
u,1,3,4,asd,
as,df,12,33,

編寫如下代碼

df =  pd.read_csv("./demo.txt",header=None,names=['a','b','c','d','e'])
print(df)

df =  pd.read_csv("./demo.txt",header=None,index_col=False,names=['a','b','c','d','e'])
print(df)

深入理解pandas
其實發現意義還真不是很大,可能文檔並沒有表述清楚他的具體作用。接下來說一下index_col的常見用途

在讀取文件的時候,如果不設置index_col列索引,默認會使用從0開始的整數索引。當對表格的某一行或列進行操作之后,在保存成文件的時候你會發現總是會多一列從0開始的列,如果設置index_col參數來設置列索引,就不會出現這種問題了。

案例2

converters 設置指定列的處理函數,可以用"序號"也可以使用“列名”進行列的指定

import pandas as pd

def fun(x):
    return str(x)+"-haha"

df =  pd.read_csv("./test.txt",sep=' ',header=None,index_col=0,converters={3:fun})
print(type(df))
print(df.shape)
print(df)

pandas深入理解read_csv

read_csv函數過程中常見的問題

  1. 有的IDE中利用Pandas的read_csv函數導入數據文件時,若文件路徑或文件名包含中文,會報錯。

解決辦法

import pandas as pd
#df=pd.read_csv('F:/測試文件夾/測試數據.txt')
f=open('F:/測試文件夾/測試數據.txt')
df=pd.read_csv(f)
  1. 排除某些行 使用 參數 skiprows.它的功能為排除某一行。
    要注意的是:排除前3行是skiprows=3 排除第3行是skiprows=[3]

  2. 對於不規則分隔符,使用正則表達式讀取文件
    文件中的分隔符采用的是空格,那么我們只需要設置sep=" "來讀取文件就可以了。當分隔符並不是單個的空格,也許有的是一個空格有的是多個空格時,如果這個時候還是采用sep=" "來讀取文件,也許你就會得到一個很奇怪的數據,因為它會將空格也做為數據。

     data = pd.read_csv("data.txt",sep="\s+")  
    
  3. 讀取的文件中如果出現中文編碼錯誤
    需要設定 encoding 參數

  4. 為行和列添加索引
    用參數names添加列索引,用index_col添加行索引

read_csv該命令有相當數量的參數。大多數都是不必要的,因為你下載的大部分文件都有標准格式。

read_table函數

基本用法是一致的,區別在於separator分隔符。
csv是逗號分隔值,僅能正確讀入以 “,” 分割的數據,read_table默認是'\t'(也就是tab)切割數據集的

read_fwf 函數

讀取具有固定寬度列的文件,例如文件

id8141    360.242940   149.910199   11950.7
id1594    444.953632   166.985655   11788.4
id1849    364.136849   183.628767   11806.2
id1230    413.836124   184.375703   11916.8
id1948    502.953953   173.237159   12468.3

read_fwf 命令有2個額外的參數可以設置

colspecs :

需要給一個元組列表,元組列表為半開區間,[from,to) ,默認情況下它會從前100行數據進行推斷。

例子:

import pandas as pd
colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
df = pd.read_fwf('demo.txt', colspecs=colspecs, header=None, index_col=0)

widths:
直接用一個寬度列表,可以代替colspecs參數

widths = [6, 14, 13, 10]
df = pd.read_fwf('demo.txt', widths=widths, header=None)

read_fwf 使用並不是很頻繁,可以參照 http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#files-with-fixed-width-columns 學習

read_msgpack 函數

pandas支持的一種新的可序列化的數據格式,這是一種輕量級的可移植二進制格式,類似於二進制JSON,這種數據空間利用率高,在寫入(序列化)和讀取(反序列化)方面都提供了良好的性能。

read_clipboard 函數

讀取剪貼板中的數據,可以看作read_table的剪貼板版本。在將網頁轉換為表格時很有用

這個地方出現如下的BUG

module 'pandas' has no attribute 'compat'

我更新了一下pandas 既可以正常使用了

python深入理解pandas
還有一個比較坑的地方,就是在讀取剪切板的時候,如果復制了中文,很容易讀取不到數據
解決辦法

  1. 打開site-packages\pandas\io\clipboard.py 這個文件需要自行檢索
  2. 在 text = clipboard_get() 后面一行 加入這句: text = text.decode('UTF-8')
  3. 保存,然后就可以使用了

read_excel 函數

依舊是官方文檔一碼當先:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel

參數 中文釋義
io 文件類對象 ,pandas Excel 文件或 xlrd 工作簿。該字符串可能是一個URL。URL包括http,ftp,s3和文件。例如,本地文件可寫成file://localhost/path/to/workbook.xlsx
sheet_name 默認是sheetname為0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe,表名用字符串表示,索引表位置用整數表示;
header 指定作為列名的行,默認0,即取第一行,數據為列名行以下的數據;若數據不含列名,則設定 header = None;
names 指定列的名字,傳入一個list數據
index_col 指定列為索引列,也可以使用u”strings” ,如果傳遞一個列表,這些列將被組合成一個MultiIndex。
squeeze 如果解析的數據只包含一列,則返回一個Series
dtype 數據或列的數據類型,參考read_csv即可
engine 如果io不是緩沖區或路徑,則必須將其設置為標識io。 可接受的值是None或xlrd
converters 參照read_csv即可
其余參數 基本和read_csv一致

pandas 讀取excel文件如果報錯,一般處理為

錯誤為:ImportError: No module named 'xlrd'
pandas讀取excel文件,需要單獨的xlrd模塊支持 pip install xlrd 即可

read_json 函數

參數 中文釋義
path_or_buf 一個有效的JSON文件,默認值為None,字符串可以為URL,例如file://localhost/path/to/table.json
orient (案例1) 預期的json字符串格式,orient的設置有以下幾個值:
1. 'split' : dict like {index -> [index], columns -> [columns], data -> [values]}
2. 'records' : list like [{column -> value}, ... , {column -> value}]
3. 'index' : dict like {index -> {column -> value}}
4. 'columns' : dict like {column -> {index -> value}}
5. 'values' : just the values array
typ 返回的格式(series or frame), 默認是 ‘frame’
dtype 數據或列的數據類型,參考read_csv即可
convert_axes boolean,嘗試將軸轉換為正確的dtypes,默認值為True
convert_dates 解析日期的列列表;如果為True,則嘗試解析類似日期的列,默認值為True
參考列標簽
it ends with '_at',
it ends with '_time',
it begins with 'timestamp',
it is 'modified',
it is 'date'
keep_default_dates boolean,default True。如果解析日期,則解析默認的日期樣列
numpy 直接解碼為numpy數組。默認為False;僅支持數字數據,但標簽可能是非數字的。還要注意,如果numpy=True,JSON排序MUST
precise_float boolean,默認False。設置為在將字符串解碼為雙精度值時啟用更高精度(strtod)函數的使用。默認值(False)是使用快速但不太精確的內置功能
date_unit string,用於檢測轉換日期的時間戳單位。默認值無。默認情況下,將檢測時間戳精度,如果不需要,則通過's','ms','us'或'ns'之一分別強制時間戳精度為秒,毫秒,微秒或納秒。
encoding json編碼
lines 每行將文件讀取為一個json對象。

如果JSON不可解析,解析器將產生ValueError/TypeError/AssertionError之一。

案例1

  1. orient='split'
	import pandas as pd
	s = '{"index":[1,2,3],"columns":["a","b"],"data":[[1,3],[2,5],[6,9]]}'
	df = pd.read_json(s,orient='split')
  1. orient='records'
    成員為字典列表
import pandas as pd
s = '[{"a":1,"b":2},{"a":3,"b":4}]'
df = pd.read_json(s,orient='records')
  1. orient='index'
    以索引為key,以列字段構成的字典為鍵值。如:

     s = '{"0":{"a":1,"b":2},"1":{"a":2,"b":4}}'
    
  2. orient='columns' 或者 values 自己推斷即可

部分中文翻譯,可以參考github> https://github.com/apachecn/pandas-doc-zh

read_json()常見BUG

讀取json文件出現 ValueError: Trailing data ,JSON格式問題
原格式為

{"a":1,"b":1},{"a":2,"b":2}

調整為

[{"a":1,"b":1},{"a":2,"b":2}]

或者使用lines參數,並且JSON調整為每行一條數據

{"a":1,"b":1}
{"a":2,"b":2}

若JSON文件中有中文,建議加上encoding參數,賦值'utf-8',否則會報錯

read_html 函數

參數 中文釋義
io 接收網址、文件、字符串。網址不接受https,嘗試去掉s后爬去
match 正則表達式,返回與正則表達式匹配的表格
flavor 解析器默認為‘lxml’
header 指定列標題所在的行,list為多重索引
index_col 指定行標題對應的列,list為多重索引
skiprows 跳過第n行(序列標示)或跳過n行(整數標示)
attrs 屬性,比如 attrs = {'id': 'table'}
parse_dates 解析日期

使用方法,在網頁中右鍵如果發現表格 也就是 table 即可使用

例如: http://data.stcn.com/2019/0304/14899644.shtml

<table class="..." id="...">
    <thead>
    <tr>
    <th>...</th>
    </tr>
    </thead>
    <tbody>
        <tr>
            <td>...</td>
        </tr>
        <tr>...</tr>
    </tbody>
</table>


<table>	: 定義表格
<thead>	: 定義表格的頁眉
<tbody>	: 定義表格的主體
<tr>	: 定義表格的行
<th>	: 定義表格的表頭
<td>	: 定義表格單元

常見BUG

出現如下報錯 ImportError: html5lib not found, please install it

安裝html5lib即可,或者使用參數

import pandas as pd
df = pd.read_html("http://data.stcn.com/2019/0304/14899644.shtml",flavor ='lxml')

更多參考源碼,可以參考 > http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html

尾聲

截止到現在,本篇博客已經完成,對於pandas讀取文件,相信你應該已經有一個深入的理解了。在pandas讀取文件的過程中,最常出現的問題,就是中文問題與格式問題,希望當你碰到的時候,可以完美的解決。

有任何問題,希望可以在評論區給我回復,期待和你一起進步,博客園-夢想橡皮擦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM