欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于pandas的read_csv方法使用解讀

 更新時(shí)間:2025年04月14日 16:48:40   作者:舞動(dòng)的白楊  
這篇文章主要介紹了關(guān)于pandas的read_csv方法使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

pandas的read_csv方法解讀

使用pandas做數(shù)據(jù)處理的第一步就是讀取數(shù)據(jù),數(shù)據(jù)源可以來自于各種地方,csv文件便是其中之一。而讀取csv文件,pandas也提供了非常強(qiáng)力的支持,參數(shù)有四五十個(gè)。這些參數(shù)中,有的很容易被忽略,但是在實(shí)際工作中卻用處很大。

比如:

  • 文件讀取時(shí)設(shè)置某些列為時(shí)間類型
  • 導(dǎo)入文件, 含有重復(fù)列
  • 過濾某些列
  • 每次迭代指定的行數(shù)
  • 值替換

pandas在讀取csv文件是通過read_csv這個(gè)函數(shù)讀取的,下面就來看看這個(gè)函數(shù)都支持哪些不同的參數(shù),看看它們都生得一副什么模樣。

read_csv中的參數(shù)

下面都是read_csv中的參數(shù),但是根據(jù)功能我們劃分為不同的類別。

以下代碼都在jupyter notebook上運(yùn)行,Python版本為3.8.2。

基本參數(shù)

filepath_or_buffer

數(shù)據(jù)輸入的路徑:可以是文件路徑、可以是URL,也可以是實(shí)現(xiàn)read方法的任意對(duì)象。

這個(gè)參數(shù),就是我們輸入的第一個(gè)參數(shù)。

import pandas as pd
pd.read_csv("girl.csv")

還可以是一個(gè)URL,如果訪問該URL會(huì)返回一個(gè)文件的話,那么pandas的read_csv函數(shù)會(huì)自動(dòng)將該文件進(jìn)行讀取。

比如:我們用fastapi寫一個(gè)服務(wù),將剛才的文件返回。

pd.read_csv("http://localhost/girl.csv")

里面還可以是一個(gè) _io.TextIOWrapper,比如:

f = open("girl.csv", encoding="utf-8")
pd.read_csv(f)

甚至還可以是一個(gè)臨時(shí)文件:

import tempfile
import pandas as pd 
 
tmp_file = tempfile.TemporaryFile("r+")
tmp_file.write(open("girl.csv", encoding="utf-8").read())
tmp_file.seek(0)
 
pd.read_csv(tmp_file)

支持的格式非常齊全,但是一般情況下,我們還是讀取實(shí)際的csv文件比較多。

sep

讀取csv文件時(shí)指定的分隔符,默認(rèn)為逗號(hào)。注意:"csv文件的分隔符" 和 "我們讀取csv文件時(shí)指定的分隔符" 一定要一致。

比如:上面的girl.csv,我們將其分隔符從逗號(hào)改成"\t",如果這個(gè)時(shí)候還是用默認(rèn)的逗號(hào)分隔符,那么數(shù)據(jù)讀取之后便混為一體。

pd.read_csv("girl.csv")

由于指定的分隔符 和 csv文件采用的分隔符 不一致,因此多個(gè)列之間沒有分開,而是連在一起了。

所以,我們需要將分隔符設(shè)置成"\t"才可以。

pd.read_csv('girl.csv', sep='\t')

delimiter

分隔符的另一個(gè)名字,與 sep 功能相似。

delim_whitespace

0.18 版本后新加參數(shù),默認(rèn)為 False,設(shè)置為 True 時(shí),表示分割符為空白字符,可以是空格、"\t"等等。

比如:girl.csv的分隔符是"\t",如果設(shè)置delim_whitespace為True的話:

pd.read_csv('girl.csv',delim_whitespace=True)

不管分隔符是什么,只要是空白字符,那么可以通過delim_whitespace=True進(jìn)行讀取。

header

設(shè)置導(dǎo)入 DataFrame 的列名稱,默認(rèn)為 "infer",注意它與下面介紹的 names 參數(shù)的微妙關(guān)系。

names

  • 當(dāng)names沒被賦值時(shí),header會(huì)變成0,即選取數(shù)據(jù)文件的第一行作為列名。
  • 當(dāng) names 被賦值,header 沒被賦值時(shí),那么header會(huì)變成None。如果都賦值,就會(huì)實(shí)現(xiàn)兩個(gè)參數(shù)的組合功能。

我們舉例說明:

1) names 沒有被賦值,header 也沒賦值:

pd.read_csv('girl.csv',delim_whitespace=True)
# 我們說這種情況下,header為變成0,即選取文件的第一行作為表頭

2) names 沒有被賦值,header 被賦值:

pd.read_csv('girl.csv',delim_whitespace=True, header=1)
# 不指定names,指定header為1,則選取第二行當(dāng)做表頭,第二行下面的是數(shù)據(jù)

3) names 被賦值,header 沒有被賦值:

pd.read_csv('girl.csv', delim_whitespace=True, names=["編號(hào)", "姓名", "地址", "日期"])

我們看到names適用于沒有表頭的情況,指定names沒有指定header,那么header相當(dāng)于None。一般來說,讀取文件會(huì)有一個(gè)表頭的,一般是第一行,但是有的文件只是數(shù)據(jù)而沒有表頭,那么這個(gè)時(shí)候我們就可以通過names手動(dòng)指定、或者生成表頭,而文件里面的數(shù)據(jù)則全部是內(nèi)容。所以這里id、name、address、date也當(dāng)成是一條記錄了,本來它是表頭的,但是我們指定了names,所以它就變成數(shù)據(jù)了,表頭是我們?cè)趎ames里面指定的

4) names和header都被賦值:

pd.read_csv('girl.csv', delim_whitespace=True, names=["編號(hào)", "姓名", "地址", "日期"], header=0)

這個(gè)相當(dāng)于先不看names,只看header,我們說header等于0代表什么呢?顯然是把第一行當(dāng)做表頭,下面的當(dāng)成數(shù)據(jù),好了,然后再把表頭用names給替換掉。

再舉個(gè)栗子:

pd.read_csv('girl.csv', delim_whitespace=True, names=["編號(hào)", "姓名", "地址", "日期"], header=3)
# header=3,表示第四行當(dāng)做表頭,第四行下面當(dāng)成數(shù)據(jù)
# 然后再把表頭用names給替換掉,得到如下結(jié)果

所以names和header的使用場景主要如下:

  1. csv文件有表頭并且是第一行,那么names和header都無需指定;
  2. csv文件有表頭、但表頭不是第一行,可能從下面幾行開始才是真正的表頭和數(shù)據(jù),這個(gè)時(shí)候指定header即可;
  3. csv文件沒有表頭,全部是純數(shù)據(jù),那么我們可以通過names手動(dòng)生成表頭;
  4. csv文件有表頭、但是這個(gè)表頭你不想用,這個(gè)時(shí)候同時(shí)指定names和header。先用header選出表頭和數(shù)據(jù),然后再用names將表頭替換掉,其實(shí)就等價(jià)于將數(shù)據(jù)讀取進(jìn)來之后再對(duì)列名進(jìn)行rename;

index_col

我們?cè)谧x取文件之后,生成的 DataFrame 的索引默認(rèn)是0 1 2 3...,我們當(dāng)然可以 set_index,但是也可以在讀取的時(shí)候就指定某個(gè)列為索引。

pd.read_csv('girl.csv', delim_whitespace=True, index_col="name")

這里指定 "name" 作為索引,另外除了指定單個(gè)列,還可以指定多個(gè)列,比如 ["id", "name"]。并且我們除了可以輸入列的名字之外,還可以輸入對(duì)應(yīng)的索引。比如:"id"、"name"、"address"、"date" 對(duì)應(yīng)的索引就分別是0、1、2、3。

usecols

如果列有很多,而我們不想要全部的列、而是只要指定的列就可以使用這個(gè)參數(shù)。

pd.read_csv('girl.csv', delim_whitespace=True, usecols=["name", "address"])

同 index_col 一樣,除了指定列名,也可以通過索引來選擇想要的列,比如:usecols=[1, 2] 也會(huì)選擇 "name" 和 "address" 兩列,因?yàn)?"name" 這一列對(duì)應(yīng)的索引是 1、"address" 對(duì)應(yīng)的索引是 2。

此外 use_cols 還有一個(gè)比較好玩的用法,就是接收一個(gè)函數(shù),會(huì)依次將列名作為參數(shù)傳遞到函數(shù)中進(jìn)行調(diào)用,如果返回值為真,則選擇該列,不為真,則不選擇。

# 選擇列名的長度大于 4 的列,顯然此時(shí)只會(huì)選擇 address 這一列
pd.read_csv('girl.csv', delim_whitespace=True, usecols=lambda x: len(x) > 4)

mangle_dupe_cols

實(shí)際生產(chǎn)用的數(shù)據(jù)會(huì)很復(fù)雜,有時(shí)導(dǎo)入的數(shù)據(jù)會(huì)含有重名的列。參數(shù) mangle_dupe_cols 默認(rèn)為 True,重名的列導(dǎo)入后面多一個(gè) .1。如果設(shè)置為 False,會(huì)拋出不支持的異常:

# ValueError: Setting mangle_dupe_cols=False is not supported yet

prefix

prefix 參數(shù),當(dāng)導(dǎo)入的數(shù)據(jù)沒有 header 時(shí),設(shè)置此參數(shù)會(huì)自動(dòng)加一個(gè)前綴。比如:

pd.read_csv('girl.csv', delim_whitespace=True, header=None)

我們看到在不指定names的時(shí)候,header默認(rèn)為0,表示以第一行為表頭。但如果不指定names、還顯式地將header指定為None,那么會(huì)自動(dòng)生成表頭0 1 2 3...,因?yàn)镈ataFrame肯定是要有列名(表頭)的。那么prefix參數(shù)干什么用的呢?

pd.read_csv('girl.csv', delim_whitespace=True, header=None, prefix="夏色祭")

所以prefix就是給這樣的列名增加前綴的,個(gè)人感覺好像不是很常用,至少本人在工作中從未用過這個(gè)參數(shù)。

squeeze

感覺又是一個(gè)沒啥卵用的參數(shù),首先我們讀取csv文件得到的是一個(gè)DataFrame,如果這個(gè)文件只有一列、或者我們只獲取一列的話,那么得到的還是一個(gè)DataFrame。

pd.read_csv('girl.csv', delim_whitespace=True, usecols=["name"])
# 這里只選擇一列

如果指定了squeeze參數(shù)為True的話,在只有一列的情況下,那么得到就是一個(gè)Series。

pd.read_csv('girl.csv', delim_whitespace=True, usecols=["name"], squeeze=True)

squeeze默認(rèn)是False,當(dāng)然如果是多列,即使指定squeeze為True,得到的依舊是DataFrame。如果只有一列,那么本來默認(rèn)還是DataFrame,但是可以通過指定這個(gè)參數(shù)為True,將其變成Series。話說你們覺得這個(gè)參數(shù)有用嗎?反正我個(gè)人覺得用處不大。

通用解析參數(shù)

dtype

筆者就曾遇到一件比較尷尬的事情,就是處理地鐵人員數(shù)據(jù)的。工作人員的id都是以0開頭的,比如0100012521,這是一個(gè)字符串。但是在讀取的時(shí)候解析成整型了,結(jié)果把開頭的0給丟了。這個(gè)時(shí)候我們就可以通過dtype來指定某個(gè)列的類型,就是告訴pandas:你在解析的時(shí)候不要自以為是,直接按照老子指定的類型進(jìn)行解析就可以了,我不要你覺得,我要我覺得。

df = pd.read_csv('girl.csv', delim_whitespace=True)
df["id"] = df["id"] * 3
df

比如這里的id,默認(rèn)解析的是整型,如果我們希望它是個(gè)字符串呢?

df = pd.read_csv('girl.csv', delim_whitespace=True, dtype={"id": str})
df["id"] = df["id"] * 3
df

我們看到id變成了字符串類型。

engine

pandas解析數(shù)據(jù)時(shí)用的引擎,pandas 目前的解析引擎提供兩種:c、python,默認(rèn)為 c,因?yàn)?c 引擎解析速度更快,但是特性沒有 python 引擎全。如果使用 c 引擎沒有的特性時(shí),會(huì)自動(dòng)退化為 python 引擎。

比如使用分隔符進(jìn)行解析,如果指定分隔符不是單個(gè)字符、或者"\s+",那么c引擎就無法解析了。我們知道如果分隔符為空白字符的話,那么可以指定delim_whitespace=True,但是也可以指定sep=r"\s+"。

pd.read_csv('girl.csv', sep=r"\s+")

如果sep是單個(gè)字符,或者字符串\s+,那么C是可以解決的。但如果我們指定的sep比較復(fù)雜,這時(shí)候引擎就會(huì)退化。

# 我們指定的\s{0}相當(dāng)于沒指定,\s+\s{0}在結(jié)果上等同于\s+。
# 但是它不是單個(gè)字符,也不是\s+,因此此時(shí)的C引擎就無法解決了,而是會(huì)退化為python引擎
pd.read_csv('girl.csv', sep=r"\s+\s{0}", encoding="utf-8")

我們看到雖然自動(dòng)退化,但是彈出了警告,這個(gè)時(shí)候需要手動(dòng)的指定engine="python"來避免警告。這里面還用到了encoding參數(shù),這個(gè)后面會(huì)說,因?yàn)橐嬉坏┩嘶?,在Windows上不指定會(huì)讀出亂碼。這里我們看到sep是可以支持正則的,但是說實(shí)話sep這個(gè)參數(shù)都會(huì)設(shè)置成單個(gè)字符,原因是讀取的csv文件的分隔符是單個(gè)字符。

converters

可以在讀取的時(shí)候?qū)α袛?shù)據(jù)進(jìn)行變換:

pd.read_csv('girl.csv', sep="\t", converters={"id": lambda x: int(x) + 10})

將id增加10,但是注意 int(x),在使用converters參數(shù)時(shí),解析器默認(rèn)所有列的類型為 str,所以需要顯式類型轉(zhuǎn)換。

true_values和false_value

指定哪些值應(yīng)該被清洗為True,哪些值被清洗為False。

pd.read_csv('girl.csv', sep="\t")

這里增加一個(gè)字段result。

pd.read_csv('girl.csv', sep="\t", true_values=["對(duì)"], false_values=["錯(cuò)"])

注意這里的替換規(guī)則,只有當(dāng)某一列的數(shù)據(jù)全部出現(xiàn)在true_values + false_values里面,才會(huì)被替換。

pd.read_csv('girl.csv', sep="\t", false_values=["錯(cuò)"])

我們看到"錯(cuò)"并沒有被替換成False,原因就是只有一個(gè)字段中所有的值都在true_values + false_values中,它們才會(huì)被替換,而"對(duì)"并沒有出現(xiàn)。

pd.read_csv('girl.csv', sep="\t",  false_values=["錯(cuò)", "對(duì)"])

此時(shí)就全部被替換成了False。

skiprows

skiprows 表示過濾行,想過濾掉哪些行,就寫在一個(gè)列表里面?zhèn)鬟f給skiprows即可。注意的是:這里是先過濾,然后再確定表頭,比如:

pd.read_csv('girl.csv', sep="\t", skiprows=[0])

我們把第一行過濾掉了,但是第一行是表頭,所以過濾掉之后,第二行就變成表頭了。如果過濾掉第二行,那么只相當(dāng)于少了一行數(shù)據(jù),但是表頭還是原來的第一行:id、name、address、date、result。

當(dāng)然里面除了傳入具體的數(shù)值,來表明要過濾掉哪些行,還可以傳入一個(gè)函數(shù)。

pd.read_csv('girl.csv', sep="\t", skiprows=lambda x: x > 0 and x % 2 == 0)

由于索引從0開始,凡是索引大于0、并且%2等于0的記錄都過濾掉。索引大于0,是為了保證表頭不被過濾掉。

skipfooter

從文件末尾過濾行,解析引擎退化為 Python。這是因?yàn)?C 解析引擎沒有這個(gè)特性。

pd.read_csv('girl.csv', sep="\t", skipfooter=3, encoding="utf-8", engine="python")

skipfooter接收整型,表示從結(jié)尾往上過濾掉指定數(shù)量的行,因?yàn)橐嫱嘶癁閜ython,那么要手動(dòng)指定engine="python",不然會(huì)警告。另外需要指定encoding="utf-8",因?yàn)閏sv存在編碼問題,當(dāng)引擎退化為python的時(shí)候,在Windows上讀取會(huì)亂碼。

nrows

nrows 參數(shù)設(shè)置一次性讀入的文件行數(shù),它在讀入大文件時(shí)很有用,比如 16G 內(nèi)存的PC無法容納幾百 G 的大文件。

pd.read_csv('girl.csv', sep="\t", nrows=1)

很多時(shí)候我們只是想看看大文件內(nèi)部的字段長什么樣子,所以這里通過nrows指定讀取的行數(shù)。

low_memory

這個(gè)看起來是和內(nèi)存有關(guān)的,但更準(zhǔn)確的說,其實(shí)它是和數(shù)據(jù)類型相關(guān)的。在解釋這個(gè)原因之前,我們還要先從DataFrame的數(shù)據(jù)類型說起。

我們知道DataFrame的每一列都是有類型的,那么在讀取csv的時(shí)候,pandas也是要根據(jù)數(shù)據(jù)來判斷每一列的類型的。但pandas主要是靠"猜"的方法,因?yàn)樵谧x取csv的時(shí)候是分塊讀取的,每讀取一塊的時(shí)候,會(huì)根據(jù)數(shù)據(jù)來判斷每一列是什么類型;然后再讀取下一塊,會(huì)再對(duì)類型進(jìn)行一個(gè)判斷,得到每一列的類型,如果得到的結(jié)果和上一個(gè)塊得到結(jié)果不一樣,那么就會(huì)發(fā)出警告,提示有以下的列存在多種數(shù)據(jù)類型:

DtypeWarning: Columns (1,5,8,......) have mixed types. Specify dtype option on import or set low_memory=False.

而為了保證正常讀取,那么會(huì)把類型像大的方向兼容,比如第一個(gè)塊的user_id被解析成整型,但是在解析第二個(gè)塊發(fā)現(xiàn)user_id有的值無法解析成整型,那么類型整體就會(huì)變成字符串,于是pandas提示該列存在混合類型。而一旦設(shè)置low_memory=False,那么pandas在讀取csv的時(shí)候就不分塊讀了,而是直接將文件全部讀取到內(nèi)存里面,這樣只需要對(duì)整體進(jìn)行一次判斷,就能得到每一列的類型。但是這種方式也有缺陷,一旦csv過大,就會(huì)內(nèi)存溢出。

不過從數(shù)據(jù)庫讀取就不用擔(dān)心了,因?yàn)閿?shù)據(jù)庫是規(guī)定了每一列的類型的。如果是從數(shù)據(jù)庫讀取得到的DataFrame,那么每一列的數(shù)據(jù)類型和數(shù)據(jù)庫表中的類型是一致的。還有,我們?cè)谏厦娼榻B了dtype,這個(gè)是我們手動(dòng)規(guī)定類型,那么pandas就會(huì)按照我們規(guī)定的類型去解析指定的列,但是一旦無法解析就會(huì)報(bào)錯(cuò)。

memory_map

如果你知道python的一個(gè)模塊mmap,那么你肯定很好理解。如果使用的數(shù)據(jù)在內(nèi)存里,那么直接進(jìn)行映射即可,不會(huì)再次進(jìn)行IO操作,默認(rèn)為False。這個(gè)參數(shù)比較底層,我們一般用不到。

空值處理相關(guān)參數(shù)

na_values

na_values 參數(shù)可以配置哪些值需要處理成 NaN,這個(gè)是非常常用的,但是用的人不多。

pd.read_csv('girl.csv', sep="\t", na_values=["對(duì)", "古明地覺"])

我們看到將"對(duì)"和"古明地覺"設(shè)置成了NaN,當(dāng)然我們這里不同的列,里面包含的值都是不相同的。但如果兩個(gè)列中包含相同的值,而我們只想將其中一個(gè)列的值換成NaN該怎么做呢?

pd.read_csv('girl.csv', sep="\t", na_values={"name": ["古明地覺", "博麗靈夢(mèng)"], "result": ["對(duì)"]})

通過字典實(shí)現(xiàn)只對(duì)指定的列進(jìn)行替換。

keep_default_na

我們知道,通過 na_values 參數(shù)可以讓 pandas 在讀取 CSV 的時(shí)候?qū)⒁恍┲付ǖ闹堤鎿Q成空值,但除了 na_values 指定的值之外,還有一些默認(rèn)的值也會(huì)在讀取的時(shí)候被替換成空值,這些值有: "-1.#IND"、"1.#QNAN"、"1.#IND"、"-1.#QNAN"、"#N/A N/A"、"#N/A"、"N/A"、"NA"、"#NA"、"NULL"、"NaN"、"-NaN"、"nan"、"-nan"、"" 。盡管這些值在 CSV 中的表現(xiàn)形式是字符串,但是 pandas 在讀取的時(shí)候會(huì)替換成空值(真正意義上的 NaN)。不過有些時(shí)候我們不希望這么做,比如有一個(gè)具有業(yè)務(wù)含義的字符串恰好就叫 "NA",那么再將它替換成空值就不對(duì)了。

這個(gè)時(shí)候就可以將 keep_default_na 指定為 False,默認(rèn)為 True,如果指定為 False,那么 pandas 在讀取時(shí)就不會(huì)擅自將那些默認(rèn)的值轉(zhuǎn)成空值了,它們?cè)?CSV 中長什么樣,pandas 讀取出來之后就還長什么樣,即使單元格中啥也沒有,那么得到的也是一個(gè)空字符串。但是注意,我們上面介紹的 na_values 參數(shù)則不受此影響,也就是說即便 keep_default_na 為 False,na_values 參數(shù)指定的值也依舊會(huì)被替換成空值。舉個(gè)栗子,假設(shè)某個(gè) CSV 中存在 "NULL"、"NA"、以及空字符串,那么默認(rèn)情況下,它們都會(huì)被替換成空值。但 "NA" 是具有業(yè)務(wù)含義的,我們希望保留原樣,而 "NULL" 和空字符串,我們還是希望 pandas 在讀取的時(shí)候能夠替換成空值,那么此時(shí)就可以在指定 keep_default_na 為 False 的同時(shí),再指定 na_values 為 ["NULL", ""]

na_filter

是否進(jìn)行空值檢測,默認(rèn)為 True,如果指定為 False,那么 pandas 在讀取 CSV 的時(shí)候不會(huì)進(jìn)行任何空值的判斷和檢測,所有的值都會(huì)保留原樣。因此,如果你能確保一個(gè) CSV 肯定沒有空值,則不妨指定 na_filter 為 False,因?yàn)楸苊饬丝罩禉z測,可以提高大型文件的讀取速度。另外,該參數(shù)會(huì)屏蔽 keep_default_na 和 na_values,也就是說,當(dāng) na_filter 為 False 的時(shí)候,這兩個(gè)參數(shù)會(huì)失效。

從效果上來說,na_filter 為 False 等價(jià)于:不指定 na_values、以及將 keep_default_na 設(shè)為 False。

skip_blank_lines

skip_blank_lines 默認(rèn)為 True,表示過濾掉空行,如為 False 則解析為 NaN。

a,b,c
1,2,3
2,3,4
 
3,4,5
4,5,6

其中 a、b、c 是表頭,下面是數(shù)據(jù),但我們看到有空行。那么默認(rèn)情況下,pandas 在讀取之后,除了表頭,會(huì)得到 4 行數(shù)據(jù),也就是空行會(huì)被過濾掉;而如果將 skip_blank_lines 指定為 False,那么除了表頭,會(huì)得到 5 行數(shù)據(jù),并且第 3 行全部是 NaN,也就是空行會(huì)被保留,但該行的所有值都為 NaN(如果指定了 keep_default_na 為 False,那么就是空字符串)。

但如果是使用 Office、WPS 等軟件手動(dòng)編輯 CSV 文件的話,那么很少會(huì)出現(xiàn)像上面那樣的空行。我舉個(gè)栗子,我們手動(dòng)錄入一個(gè) CSV 文件:

此時(shí)讀取的時(shí)候,無論 skip_blank_lines 是否為 True,圖中索引為 4 的數(shù)據(jù)都不會(huì)被過濾掉,原因就在于雖然每個(gè)單元格都為空,但這樣一整行卻并不為空,我們可以用 notepad++ 打開看一下,CSV 就是一個(gè)純文本。

a,b,c
1,2,3
2,3,4
,,
3,4,5
4,5,6

我們看到即使每個(gè)單元格都是空(CSV 中的空,本質(zhì)上就是個(gè)空字符串),但這一行卻并不為空,原因就是自動(dòng)添加了分隔符。因此讀取之后該行永遠(yuǎn)不會(huì)被過濾掉,而是將其所有值都變成 NaN,因?yàn)?pandas 讀取的時(shí)候默認(rèn)會(huì)將空字符串解析成 NaN,當(dāng)然,我們依舊可以指定 keep_default_na 為 False 來改變這一點(diǎn)。

verbose

打印一些額外信息

時(shí)間處理相關(guān)參數(shù)

parse_dates

指定某些列為時(shí)間類型,這個(gè)參數(shù)一般搭配下面的date_parser使用。

date_parser

是用來配合parse_dates參數(shù)的,因?yàn)橛械牧须m然是日期,但沒辦法直接轉(zhuǎn)化,需要我們指定一個(gè)解析格式:

from datetime import datetimepd.read_csv('girl.csv', sep="\t", parse_dates=["date"], date_parser=lambda x: datetime.strptime(x, "%Y年%m月%d日"))

infer_datetime_format

infer_datetime_format 參數(shù)默認(rèn)為 False。如果設(shè)定為 True 并且 parse_dates 可用,那么 pandas 將嘗試轉(zhuǎn)換為日期類型,如果可以轉(zhuǎn)換,轉(zhuǎn)換方法并解析,在某些情況下會(huì)快 5~10 倍。

分塊讀入相關(guān)參數(shù)

分塊讀入內(nèi)存,尤其單機(jī)處理大文件時(shí)會(huì)很有用。

iterator

iterator 為 bool類型,默認(rèn)為False。如果為True,那么返回一個(gè) TextFileReader 對(duì)象,以便逐塊處理文件。這個(gè)在文件很大、內(nèi)存無法容納所有數(shù)據(jù)文件時(shí),可以分批讀入,依次處理。

chunk = pd.read_csv('girl.csv', sep="\t", iterator=True)
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x000002550189C0A0>
 
print(chunk.get_chunk(1))
"""
   id  name        address       date         result
0   1  古明地覺     地靈殿    1999年3月8日      對(duì)
"""
 
print(chunk.get_chunk(2))
"""
   id  name         address       date         result
1   2  博麗靈夢(mèng)     博麗神社    1999年3月8日      錯(cuò)
2   3  芙蘭朵露     紅魔館      1999年3月8日      錯(cuò)
"""
 
# 文件還剩下三行,但是我們指定讀取100,那么也不會(huì)報(bào)錯(cuò),不夠指定的行數(shù),那么有多少返回多少
print(chunk.get_chunk(100))
"""
   id    name          address    date         result
3   4  西行寺幽幽子    白玉樓   1999年3月8日      對(duì)
4   5   霧雨魔理沙    魔法森林  1999年3月8日      對(duì)
5   6    八意永琳     永遠(yuǎn)亭    1999年3月8日      對(duì)
"""
 
try:
    # 但是在讀取完畢之后,再讀的話就會(huì)報(bào)錯(cuò)了
    chunk.get_chunk(5)
except StopIteration as e:
    print("讀取完畢")
# 讀取完畢    

chunksize

chunksize 整型,默認(rèn)為 None,設(shè)置文件塊的大小。

chunk = pd.read_csv('girl.csv', sep="\t", chunksize=2)
# 還是返回一個(gè)類似于迭代器的對(duì)象
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x0000025501143AF0>
 
 
# 調(diào)用get_chunk,如果不指定行數(shù),那么就是默認(rèn)的chunksize
print(chunk.get_chunk())
"""
   id    name      address          date        result
0   1  古明地覺     地靈殿       1999年3月8日      對(duì)
1   2  博麗靈夢(mèng)    博麗神社      1999年3月8日      錯(cuò)
"""
 
# 但也可以指定
print(chunk.get_chunk(100))
"""
   id      name       address       date         result
2   3    芙蘭朵露     紅魔館     1999年3月8日        錯(cuò) 
3   4  西行寺幽幽子   白玉樓     1999年3月8日        對(duì)
4   5   霧雨魔理沙    魔法森林   1999年3月8日        對(duì)
5   6    八意永琳     永遠(yuǎn)亭     1999年3月8日        對(duì)
"""
 
try:
    chunk.get_chunk(5)
except StopIteration as e:
    print("讀取完畢")
# 讀取完畢    

格式和壓縮相關(guān)參數(shù)

compression

compression 參數(shù)取值為 {'infer', 'gzip', 'bz2', 'zip', 'xz', None},默認(rèn) 'infer',這個(gè)參數(shù)直接支持我們使用磁盤上的壓縮文件。

# 直接將上面的girl.csv添加到壓縮文件,打包成girl.zip
pd.read_csv('girl.zip', sep="\t", compression="zip")

thousands

千分位分割符,如 , 或者 .,默認(rèn)為None。

encoding

encoding 指定字符集類型,通常指定為 'utf-8'。根據(jù)情況也可能是'ISO-8859-1'

error_bad_lines和warn_bad_lines

如果一行包含過多的列,假設(shè)csv的數(shù)據(jù)有5列,但是某一行卻有6個(gè)數(shù)據(jù),顯然數(shù)據(jù)有問題。那么默認(rèn)情況下不會(huì)返回DataFrame,而是會(huì)報(bào)錯(cuò)。

# ParserError: Error tokenizing data. C error: Expected 5 fields in line 5, saw 6

我們?cè)谀骋恍兄卸嗉恿艘粋€(gè)數(shù)據(jù),結(jié)果顯示錯(cuò)誤。因?yàn)間irl.csv里面有5列,但是有一行卻有6個(gè)數(shù)據(jù),所以報(bào)錯(cuò)。

在小樣本讀取時(shí),這個(gè)錯(cuò)誤很快就能發(fā)現(xiàn)。但是如果樣本比較大、并且由于數(shù)據(jù)集不可能那么干凈,會(huì)很容易出現(xiàn)這種情況,那么該怎么辦呢?而且這種情況下,Excel基本上是打不開這么大的文件的。這個(gè)時(shí)候我們就可以將error_bad_lines設(shè)置為False(默認(rèn)為True),意思是遇到這種情況,直接把這一行給我扔掉。同時(shí)會(huì)設(shè)置 warn_bad_lines 設(shè)置為True,打印剔除的這行。

pd.read_csv('girl.csv', sep="\t", error_bad_lines=False, warn_bad_lines=True)

以上兩參數(shù)只能在C解析引擎下使用。

總結(jié)

以上便是pandas的read_csv函數(shù)中絕大部分參數(shù)了,而且其中的部分參數(shù)也適用于讀取其它類型的文件。其實(shí)在讀取csv文件時(shí)所使用的參數(shù)就那么幾個(gè),很多參數(shù)平常都不會(huì)用,但至少要了解一下,因?yàn)樵谀承┨囟ǖ膱鼍跋滤鼈兪强梢院芊奖愕貛臀覀兘鉀Q一些問題的。

當(dāng)然,read_csv函數(shù)中的參數(shù)還不止我們上面說的那些,有幾個(gè)我們還沒有介紹到,感興趣可以自己看一下。但是個(gè)人覺得,掌握上面的那些參數(shù)的用法的話,其實(shí)已經(jīng)完全夠用了。

這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解查看Python解釋器路徑的兩種方式

    詳解查看Python解釋器路徑的兩種方式

    這篇文章主要介紹了詳解查看Python解釋器路徑的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python實(shí)戰(zhàn)之單詞打卡統(tǒng)計(jì)

    Python實(shí)戰(zhàn)之單詞打卡統(tǒng)計(jì)

    這篇文章主要介紹了Python實(shí)戰(zhàn)之單詞打卡統(tǒng)計(jì),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • pycharm如何使用anaconda中的各種包(操作步驟)

    pycharm如何使用anaconda中的各種包(操作步驟)

    這篇文章主要介紹了pycharm如何使用anaconda中的各種包,本文通過操作步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python基于React-Dropzone實(shí)現(xiàn)上傳組件的示例代碼

    Python基于React-Dropzone實(shí)現(xiàn)上傳組件的示例代碼

    本文主要介紹了在React-Flask框架上開發(fā)上傳組件的技巧。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • python讀取大文件越來越慢的原因與解決

    python讀取大文件越來越慢的原因與解決

    這篇文章主要給大家介紹了關(guān)于python讀取大文件越來越慢的原因與解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解python內(nèi)置模塊urllib

    詳解python內(nèi)置模塊urllib

    這篇文章主要介紹了python內(nèi)置模塊urllib的相關(guān)資料,幫助大家更好的理解和使用python 內(nèi)置模塊,感興趣的朋友可以了解下
    2020-09-09
  • keras導(dǎo)入weights方式

    keras導(dǎo)入weights方式

    這篇文章主要介紹了keras導(dǎo)入weights方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 在python中使用xlrd獲取合并單元格的方法

    在python中使用xlrd獲取合并單元格的方法

    今天小編就為大家分享一篇在python中使用xlrd獲取合并單元格的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • hmac模塊生成加入了密鑰的消息摘要詳解

    hmac模塊生成加入了密鑰的消息摘要詳解

    這篇文章主要介紹了hmac模塊生成加入了密鑰的消息摘要詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python協(xié)程的用法和例子詳解

    Python協(xié)程的用法和例子詳解

    這篇文章主要為大家詳細(xì)介紹了Python協(xié)程的用法和例子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評(píng)論