Python?Pandas讀取csv/tsv文件(read_csv,read_table)的區(qū)別
前言
要將csv和tsv文件讀取為pandas.DataFrame格式,可以使用Pandas的函數(shù)read_csv()或read_table()。
在此
- read_csv()和read_table()之間的區(qū)別
- 讀取沒有標(biāo)題的CSV
- 讀取有標(biāo)題的CSV
- 讀取有index的CSV
- 指定(選擇)要讀取的列
- 跳過(guò)(排除)行的讀取
- 通過(guò)指定類型dtype進(jìn)行讀取
- NaN缺失值的處理
- 讀取使用zip等壓縮的文件
- tsv的讀取
對(duì)以上的內(nèi)容進(jìn)行說(shuō)明。
read_csv()和read_table()之間的區(qū)別
函數(shù)pd.read_csv()和pd.read_table()的內(nèi)容相同,只是默認(rèn)分隔符不同。
在read_csv()中,定界符為,,在read_table()中,定界符為\ t。
查看源代碼,它調(diào)用相同的函數(shù)。
read_csv = _make_parser_function('read_csv', sep=',')
read_csv = Appender(_read_csv_doc)(read_csv)
read_table = _make_parser_function('read_table', sep='\t')
read_table = Appender(_read_table_doc)(read_table)
如果要讀取csv文件(以逗號(hào)分隔),使用函數(shù)read_csv(),如果要讀取tsv文件(以制表符分隔),使用函數(shù)read_table()也可以。
如果既不是逗號(hào)也不是制表符,則可以通過(guò)參數(shù)(sep或delimiter)設(shè)置區(qū)分符。
以下,將使用說(shuō)明read_csv(),但是對(duì)read_table也是如此。
讀取沒有標(biāo)題的CSV
讀取以下不帶標(biāo)題的csv文件。
11,12,13,14
21,22,23,24
31,32,33,34
如果未設(shè)置任何參數(shù),則將第一行識(shí)別為標(biāo)題并將自動(dòng)分配列名columns。
df = pd.read_csv('./data/03/sample.csv')
print(df)
# 11 12 13 14
# 0 21 22 23 24
# 1 31 32 33 34
print(df.columns)
# Index(['11', '12', '13', '14'], dtype='object')
如果header = None,則將為列名列分配一個(gè)序號(hào)。
df_none = pd.read_csv('./data/03/sample.csv', header=None)
print(df_none)
# 0 1 2 3
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
可以將任意值設(shè)置為列名,參數(shù)為name=(‘A’,‘B’,‘C’,‘D’)。通過(guò)列表或元組指定。
df_names = pd.read_csv('./data/03/sample.csv', names=('A', 'B', 'C', 'D'))
print(df_names)
# A B C D
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
讀取有標(biāo)題的CSV
讀取以下帶標(biāo)頭的csv文件。
a,b,c,d
11,12,13,14
21,22,23,24
31,32,33,34
指定標(biāo)題的行號(hào)從0開始,例如header = 0。由于默認(rèn)值為header = 0,因此如果第一行是header,則可以獲得相同的結(jié)果。
df_header = pd.read_csv('./data/03/sample_header.csv')
print(df_header)
# a b c d
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
df_header_0 = pd.read_csv('./data/03/sample_header.csv', header=0)
print(df_header_0)
# a b c d
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
使用header進(jìn)行起始行的讀取指定。
df_header_2 = pd.read_csv('./data/03/sample_header.csv', header=2)
print(df_header_2)
# 21 22 23 24
# 0 31 32 33 34
讀取有index的CSV
讀取以下帶有標(biāo)題和索引(標(biāo)題列)的csv文件。
,a,b,c,d ONE,11,12,13,14 TWO,21,22,23,24 THREE,31,32,33,34
如果未指定任何內(nèi)容,則不會(huì)識(shí)別索引列。
df_header_index = pd.read_csv('./data/03/sample_header_index.csv')
print(df_header_index)
# Unnamed: 0 a b c d
# 0 ONE 11 12 13 14
# 1 TWO 21 22 23 24
# 2 THREE 31 32 33 34
print(df_header_index.index)
# RangeIndex(start=0, stop=3, step=1)
指定要用作索引的列的列號(hào),從0開始,例如index_col = 0。
df_header_index_col = pd.read_csv('./data/03/sample_header_index.csv',
index_col=0)
print(df_header_index_col)
# a b c d
# ONE 11 12 13 14
# TWO 21 22 23 24
# THREE 31 32 33 34
print(df_header_index_col.index)
# Index(['ONE', 'TWO', 'THREE'], dtype='object')
指定(選擇)要讀取的列
要僅讀取特定的列,請(qǐng)使用usecols參數(shù)。 指定要在列表中讀取的列號(hào)。即使只有一列,也要使用列表。
df_none_usecols = pd.read_csv('./data/03/sample.csv',
header=None, usecols=[1, 3])
print(df_none_usecols)
# 1 3
# 0 12 14
# 1 22 24
# 2 32 34
df_none_usecols = pd.read_csv('./data/03/sample.csv',
header=None, usecols=[2])
print(df_none_usecols)
# 2
# 0 13
# 1 23
# 2 33
也可以按列名而不是列號(hào)指定。
df_header_usecols = pd.read_csv('./data/03/sample_header.csv',
usecols=['a', 'c'])
print(df_header_usecols)
# a c
# 0 11 13
# 1 21 23
# 2 31 33
在沒有特定列的情況下時(shí),使用匿名函數(shù)(lambda表達(dá)式)很方便。尤其是當(dāng)您要從具有許多列的文件中排除少量列并讀取它們時(shí),比指定要讀取的大量列號(hào)要容易得多。
df_header_usecols = pd.read_csv('./data/03/sample_header.csv',
usecols=lambda x: x is not 'b')
print(df_header_usecols)
# a c d
# 0 11 13 14
# 1 21 23 24
# 2 31 33 34
df_header_usecols = pd.read_csv('./data/03/sample_header.csv',
usecols=lambda x: x not in ['a', 'c'])
print(df_header_usecols)
# b d
# 0 12 14
# 1 22 24
# 2 32 34
當(dāng)與index_col一起使用時(shí),由index_col指定的列也必須由usecols指定。
df_index_usecols = pd.read_csv('./data/03/sample_header_index.csv',
index_col=0, usecols=[0, 1, 3])
print(df_index_usecols)
# a c
# ONE 11 13
# TWO 21 23
# THREE 31 33
跳過(guò)(排除)行的讀取
skiprows
要跳過(guò)(排除)特定行并讀取它們,使用參數(shù)skipprows。 如果將整數(shù)傳遞給跳過(guò)行,那么將跳過(guò)那么多行的文件開頭。
df_none = pd.read_csv('./data/03/sample.csv', header=None)
print(df_none)
# 0 1 2 3
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
df_none = pd.read_csv('./data/03/sample.csv', header=None, skiprows=2)
print(df_none)
# 0 1 2 3
# 0 31 32 33 34
可以指定要跳過(guò)的行號(hào)列表。與usecols不同,指定要跳過(guò)的行,而不是要讀取的行。 即使在一行中也要使用列表。
df_none_skiprows = pd.read_csv('./data/03/sample.csv',
header=None, skiprows=[0, 2])
print(df_none_skiprows)
# 0 1 2 3
# 0 21 22 23 24
df_none_skiprows = pd.read_csv('./data/03/sample.csv',
header=None, skiprows=[1])
print(df_none_skiprows)
# 0 1 2 3
# 0 11 12 13 14
# 1 31 32 33 34
僅讀取特定行時(shí),使用匿名函數(shù)(lambda表達(dá)式)會(huì)很方便。特別是當(dāng)您只想從文件中讀取多行的特定行時(shí),比指定要跳過(guò)的行數(shù)要容易得多。
df_none_skiprows = pd.read_csv('./data/03/sample.csv', header=None,
skiprows=lambda x: x not in [0, 2])
print(df_none_skiprows)
# 0 1 2 3
# 0 11 12 13 14
# 1 31 32 33 34
請(qǐng)注意,如果文件具有標(biāo)題,則還需要考慮標(biāo)題行。
df_header_skiprows = pd.read_csv('./data/03/sample_header.csv', skiprows=[1])
print(df_header_skiprows)
# a b c d
# 0 21 22 23 24
# 1 31 32 33 34
df_header_skiprows = pd.read_csv('./data/03/sample_header.csv', skiprows=[0, 3])
print(df_header_skiprows)
# 11 12 13 14
# 0 21 22 23 24
請(qǐng)注意,即使指定了索引,也無(wú)法通過(guò)行名指定skipprows。
skipfooter
要跳過(guò)文件的末尾,請(qǐng)使用skipfooter參數(shù)。將要跳過(guò)的行數(shù)指定為整數(shù)。 根據(jù)環(huán)境的不同,會(huì)出現(xiàn)以下警告,因此請(qǐng)指定參數(shù)engine =‘python’。
ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'.
df_none_skipfooter = pd.read_csv('./data/03/sample.csv', header=None,
skipfooter=1, engine='python')
print(df_none_skipfooter)
# 0 1 2 3
# 0 11 12 13 14
# 1 21 22 23 24
nrows
也可以只閱讀前幾行。使用參數(shù)nrows。 當(dāng)想檢查大文件的數(shù)據(jù)時(shí)很有用。
df_none_nrows = pd.read_csv('./data/03/sample.csv', header=None, nrows=2)
print(df_none_nrows)
# 0 1 2 3
# 0 11 12 13 14
# 1 21 22 23 24
通過(guò)指定類型dtype進(jìn)行讀取
在pandas.DataFrame中,為每一列設(shè)置類型dtype,可以使用astype()方法對(duì)其進(jìn)行轉(zhuǎn)換(轉(zhuǎn)換)。
以下文件為例。
,a,b,c,d ONE,1,"001",100,x TWO,2,"020",,y THREE,3,"300",300,z
默認(rèn)情況下,以0開頭的數(shù)字序列(無(wú)論是否帶引號(hào))都被視為數(shù)字,而不是字符串,并且省略前導(dǎo)零。
df_default = pd.read_csv('./data/03/sample_header_index_dtype.csv', index_col=0)
print(df_default)
# a b c d
# ONE 1 1 100.0 x
# TWO 2 20 NaN y
# THREE 3 300 300.0 z
print(df_default.dtypes)
# a int64
# b int64
# c float64
# d object
# dtype: object
print(df_default.applymap(type))
# a b c d
# ONE <class 'int'> <class 'int'> <class 'float'> <class 'str'>
# TWO <class 'int'> <class 'int'> <class 'float'> <class 'str'>
# THREE <class 'int'> <class 'int'> <class 'float'> <class 'str'>
如果要作為包含前導(dǎo)0的字符串進(jìn)行處理,請(qǐng)指定read_csv()的參數(shù)dtype。
如果在參數(shù)dtype中指定了任意數(shù)據(jù)類型,則包括index_col指定的列在內(nèi)的所有列都將轉(zhuǎn)換為該類型并讀取。例如,如果dtype = str,則所有列都強(qiáng)制轉(zhuǎn)換為字符串。但是,同樣在這種情況下,缺少的值是浮點(diǎn)類型。
df_str = pd.read_csv('./data/03/sample_header_index_dtype.csv',
index_col=0,dtype=str)
print(df_str)
# a b c d
# ONE 1 001 100 x
# TWO 2 020 NaN y
# THREE 3 300 300 z
print(df_str.dtypes)
# a object
# b object
# c object
# d object
# dtype: object
print(df_str.applymap(type))
# a b c d
# ONE <class 'str'> <class 'str'> <class 'str'> <class 'str'>
# TWO <class 'str'> <class 'str'> <class 'float'> <class 'str'>
# THREE <class 'str'> <class 'str'> <class 'str'> <class 'str'>
dtype = object也是如此。
df_object = pd.read_csv('./data/03/sample_header_index_dtype.csv',
index_col=0, dtype=object)
print(df_object)
# a b c d
# ONE 1 001 100 x
# TWO 2 020 NaN y
# THREE 3 300 300 z
print(df_object.dtypes)
# a object
# b object
# c object
# d object
# dtype: object
print(df_object.applymap(type))
# a b c d
# ONE <class 'str'> <class 'str'> <class 'str'> <class 'str'>
# TWO <class 'str'> <class 'str'> <class 'float'> <class 'str'>
# THREE <class 'str'> <class 'str'> <class 'str'> <class 'str'>
請(qǐng)注意,在參數(shù)dtype中指定無(wú)法轉(zhuǎn)換的類型將導(dǎo)致錯(cuò)誤。在此示例中,將由index_col指定的字符串的索引列轉(zhuǎn)換為整數(shù)int類型時(shí)發(fā)生錯(cuò)誤。
# df_int = pd.read_csv('data/src/sample_header_index_dtype.csv',
# index_col=0, dtype=int)
# ValueError: invalid literal for int() with base 10: 'ONE'
要在讀取后轉(zhuǎn)換pandas.DataFrame的列類型,請(qǐng)?jiān)赼stype()方法中以字典格式指定它。
df_str_cast = df_str.astype({'a': int})
print(df_str_cast)
# a b c d
# ONE 1 001 100 x
# TWO 2 020 NaN y
# THREE 3 300 300 z
print(df_str_cast.dtypes)
# a int64
# b object
# c object
# d object
# dtype: object
使用read_csv()進(jìn)行讀取時(shí),可以在字典格式中的參數(shù)dtype中指定列類型。將自動(dòng)選擇除指定列以外的其他類型。
df_str_col = pd.read_csv('./data/03/sample_header_index_dtype.csv',
index_col=0, dtype={'b': str, 'c': str})
print(df_str_col)
# a b c d
# ONE 1 001 100 x
# TWO 2 020 NaN y
# THREE 3 300 300 z
print(df_str_col.dtypes)
# a int64
# b object
# c object
# d object
# dtype: object
不僅可以指定列名,還可以指定列號(hào)。注意,在指定索引列時(shí),必須指定包括索引列的列號(hào)。
df_str_col_num = pd.read_csv('./data/03/sample_header_index_dtype.csv',
index_col=0, dtype={2: str, 3: str})
print(df_str_col_num)
# a b c d
# ONE 1 001 100 x
# TWO 2 020 NaN y
# THREE 3 300 300 z
print(df_str_col_num.dtypes)
# a int64
# b object
# c object
# d object
# dtype: object
NaN缺失值的處理
默認(rèn)情況下,read_csv()和read_table()將某些值視為缺少的NaN。
默認(rèn)情況下,可能的值(例如空字符串”,字符串“ NaN”,“ nan”和null)通常默認(rèn)為缺少NaN,如下所示:
By default the following values are interpreted as NaN: ‘', ‘#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'.
以下文件為例檢查操作。
,a,b ONE,,NaN TWO,-,nan THREE,null,N/A
特別是,如果您在默認(rèn)情況下未設(shè)置任何參數(shù)而進(jìn)行讀取,并使用isnull()方法對(duì)其進(jìn)行了檢查,則可以看到除“-”以外的其他非目標(biāo)均被視為缺失值NaN。
df_nan = pd.read_csv('./data/03/sample_header_index_nan.csv', index_col=0)
print(df_nan)
# a b
# ONE NaN NaN
# TWO - NaN
# THREE NaN NaN
print(df_nan.isnull())
# a b
# ONE True True
# TWO False True
# THREE True True
要指定默認(rèn)值以外的值,將其視為缺失值,使用參數(shù)na_values。
df_nan_set_na = pd.read_csv('./data/03/sample_header_index_nan.csv',
index_col=0, na_values='-')
print(df_nan_set_na)
# a b
# ONE NaN NaN
# TWO NaN NaN
# THREE NaN NaN
print(df_nan_set_na.isnull())
# a b
# ONE True True
# TWO True True
# THREE True True
如果在將參數(shù)keep_default_na設(shè)置為False之后為參數(shù)na_values指定值,則僅將為na_values指定的值視為缺失值。除非在na_values中指定,否則默認(rèn)值不會(huì)被視為缺失值。
df_nan_set_na_no_keep = pd.read_csv('./data/03/sample_header_index_nan.csv',
index_col=0,
na_values=['-', 'NaN', 'null'],
keep_default_na=False)
print(df_nan_set_na_no_keep)
# a b
# ONE NaN
# TWO NaN nan
# THREE NaN N/A
print(df_nan_set_na_no_keep.isnull())
# a b
# ONE False True
# TWO True False
# THREE True False
如果參數(shù)na_filter設(shè)置為False,則無(wú)論參數(shù)na_values和keep_default_na的規(guī)格如何,所有值都將按原樣讀取,并且不會(huì)被視為缺失值。
df_nan_no_filter = pd.read_csv('./data/03/sample_header_index_nan.csv',
index_col=0, na_filter=False)
print(df_nan_no_filter)
# a b
# ONE NaN
# TWO - nan
# THREE null N/A
print(df_nan_no_filter.isnull())
# a b
# ONE False False
# TWO False False
# THREE False False
讀取使用zip等壓縮的文件
也可以按原樣讀取通過(guò)zip等壓縮的csv文件。
df_zip = pd.read_csv('./data/03/sample_header.zip')
print(df_zip)
# a b c d
# 0 11 12 13 14
# 1 21 22 23 24
# 2 31 32 33 34
如果擴(kuò)展名是.gz,.bz2,.zip,.xz,則會(huì)自動(dòng)檢測(cè)并擴(kuò)展。如果擴(kuò)展名不同,請(qǐng)?jiān)赾ompression參數(shù)中顯式指定字符串“ gz”,“ bz2”,“ zip”和“ xz”。
請(qǐng)注意,僅限壓縮單個(gè)csv文件。如果壓縮多個(gè)文件,則會(huì)發(fā)生錯(cuò)誤。
tsv的讀取
在開始時(shí)所寫的那樣,如果要讀取tsv文件(制表符分隔),則可以使用read_table()。
對(duì)于如下文件
a b c d
ONE 11 12 13 14
TWO 21 22 23 24
THREE 31 32 33 34
參數(shù)與read_csv()相同。
df_tsv = pd.read_table('./data/03/sample_header_index.tsv', index_col=0)
print(df_tsv)
# a b c d
# ONE 11 12 13 14
# TWO 21 22 23 24
# THREE 31 32 33 34
通過(guò)read_csv()將制表符\t設(shè)置為區(qū)別符,也可以讀取它。
df_tsv_sep = pd.read_csv('./data/03/sample_header_index.tsv',
index_col=0, sep='\t')
print(df_tsv_sep)
# a b c d
# ONE 11 12 13 14
# TWO 21 22 23 24
# THREE 31 32 33 34
總結(jié)
到此這篇關(guān)于Python Pandas讀取csv/tsv文件(read_csv,read_table)區(qū)別的文章就介紹到這了,更多相關(guān)Pandas讀取csv/tsv文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python從list列表中選出一個(gè)數(shù)和其對(duì)應(yīng)的坐標(biāo)方法
今天小編就為大家分享一篇python從list列表中選出一個(gè)數(shù)和其對(duì)應(yīng)的坐標(biāo)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python實(shí)戰(zhàn)之實(shí)現(xiàn)簡(jiǎn)單的名片管理系統(tǒng)
這篇文章主要介紹了Python實(shí)戰(zhàn)之實(shí)現(xiàn)簡(jiǎn)單的名片管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
Python簡(jiǎn)單實(shí)現(xiàn)阿拉伯?dāng)?shù)字和羅馬數(shù)字的互相轉(zhuǎn)換功能示例
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)阿拉伯?dāng)?shù)字和羅馬數(shù)字的互相轉(zhuǎn)換功能,涉及Python針對(duì)字符串與列表的遍歷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
Python Flask框架實(shí)現(xiàn)簡(jiǎn)單加法工具過(guò)程解析
這篇文章主要介紹了Python Flask框架實(shí)現(xiàn)簡(jiǎn)單加法工具過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式
今天小編就為大家分享一篇django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
人工智能-Python實(shí)現(xiàn)多項(xiàng)式回歸
這篇文章主要介紹了人工智能-Python實(shí)現(xiàn)多項(xiàng)式回歸,上一次我們講解了線性回歸,這次我們重點(diǎn)分析多項(xiàng)式回歸,需要的小伙伴可以參考一下2022-01-01

