Python Pandas讀取csv/tsv文件(read_csv,read_table)的區別
前言
要將csv和tsv文件讀取為pandas.DataFrame格式,可以使用Pandas的函數read_csv()或read_table()。
在此
- read_csv()和read_table()之間的區別
- 讀取沒有標題的CSV
- 讀取有標題的CSV
- 讀取有index的CSV
- 指定(選擇)要讀取的列
- 跳過(排除)行的讀取
- 通過指定類型dtype進行讀取
- NaN缺失值的處理
- 讀取使用zip等壓縮的文件
- tsv的讀取
對以上的內容進行說明。
read_csv()和read_table()之間的區別
函數pd.read_csv()和pd.read_table()的內容相同,隻是默認分隔符不同。
在read_csv()中,定界符為,,在read_table()中,定界符為\ t。
查看源代碼,它調用相同的函數。
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文件(以逗號分隔),使用函數read_csv(),如果要讀取tsv文件(以制表符分隔),使用函數read_table()也可以。
如果既不是逗號也不是制表符,則可以通過參數(sep或delimiter)設置區分符。
以下,將使用說明read_csv(),但是對read_table也是如此。
讀取沒有標題的CSV
讀取以下不帶標題的csv文件。
11,12,13,14
21,22,23,24
31,32,33,34
如果未設置任何參數,則將第一行識別為標題並將自動分配列名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,則將為列名列分配一個序號。
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
可以將任意值設置為列名,參數為name=(‘A’,‘B’,‘C’,‘D’)。通過列表或元組指定。
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
讀取有標題的CSV
讀取以下帶標頭的csv文件。
a,b,c,d
11,12,13,14
21,22,23,24
31,32,33,34
指定標題的行號從0開始,例如header = 0。由於默認值為header = 0,因此如果第一行是header,則可以獲得相同的結果。
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進行起始行的讀取指定。
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
讀取以下帶有標題和索引(標題列)的csv文件。
,a,b,c,d ONE,11,12,13,14 TWO,21,22,23,24 THREE,31,32,33,34
如果未指定任何內容,則不會識別索引列。
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)
指定要用作索引的列的列號,從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')
指定(選擇)要讀取的列
要僅讀取特定的列,請使用usecols參數。 指定要在列表中讀取的列號。即使隻有一列,也要使用列表。
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
也可以按列名而不是列號指定。
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
在沒有特定列的情況下時,使用匿名函數(lambda表達式)很方便。尤其是當您要從具有許多列的文件中排除少量列並讀取它們時,比指定要讀取的大量列號要容易得多。
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
當與index_col一起使用時,由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
跳過(排除)行的讀取
skiprows
要跳過(排除)特定行並讀取它們,使用參數skipprows。 如果將整數傳遞給跳過行,那麼將跳過那麼多行的文件開頭。
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
可以指定要跳過的行號列表。與usecols不同,指定要跳過的行,而不是要讀取的行。 即使在一行中也要使用列表。
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
僅讀取特定行時,使用匿名函數(lambda表達式)會很方便。特別是當您隻想從文件中讀取多行的特定行時,比指定要跳過的行數要容易得多。
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
請註意,如果文件具有標題,則還需要考慮標題行。
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
請註意,即使指定瞭索引,也無法通過行名指定skipprows。
skipfooter
要跳過文件的末尾,請使用skipfooter參數。將要跳過的行數指定為整數。 根據環境的不同,會出現以下警告,因此請指定參數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
也可以隻閱讀前幾行。使用參數nrows。 當想檢查大文件的數據時很有用。
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
通過指定類型dtype進行讀取
在pandas.DataFrame中,為每一列設置類型dtype,可以使用astype()方法對其進行轉換(轉換)。
以下文件為例。
,a,b,c,d ONE,1,"001",100,x TWO,2,"020",,y THREE,3,"300",300,z
默認情況下,以0開頭的數字序列(無論是否帶引號)都被視為數字,而不是字符串,並且省略前導零。
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'>
如果要作為包含前導0的字符串進行處理,請指定read_csv()的參數dtype。
如果在參數dtype中指定瞭任意數據類型,則包括index_col指定的列在內的所有列都將轉換為該類型並讀取。例如,如果dtype = str,則所有列都強制轉換為字符串。但是,同樣在這種情況下,缺少的值是浮點類型。
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'>
請註意,在參數dtype中指定無法轉換的類型將導致錯誤。在此示例中,將由index_col指定的字符串的索引列轉換為整數int類型時發生錯誤。
# 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'
要在讀取後轉換pandas.DataFrame的列類型,請在astype()方法中以字典格式指定它。
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()進行讀取時,可以在字典格式中的參數dtype中指定列類型。將自動選擇除指定列以外的其他類型。
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
不僅可以指定列名,還可以指定列號。註意,在指定索引列時,必須指定包括索引列的列號。
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缺失值的處理
默認情況下,read_csv()和read_table()將某些值視為缺少的NaN。
默認情況下,可能的值(例如空字符串”,字符串“ NaN”,“ nan”和null)通常默認為缺少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
特別是,如果您在默認情況下未設置任何參數而進行讀取,並使用isnull()方法對其進行瞭檢查,則可以看到除“-”以外的其他非目標均被視為缺失值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
要指定默認值以外的值,將其視為缺失值,使用參數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
如果在將參數keep_default_na設置為False之後為參數na_values指定值,則僅將為na_values指定的值視為缺失值。除非在na_values中指定,否則默認值不會被視為缺失值。
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
如果參數na_filter設置為False,則無論參數na_values和keep_default_na的規格如何,所有值都將按原樣讀取,並且不會被視為缺失值。
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等壓縮的文件
也可以按原樣讀取通過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
如果擴展名是.gz,.bz2,.zip,.xz,則會自動檢測並擴展。如果擴展名不同,請在compression參數中顯式指定字符串“ gz”,“ bz2”,“ zip”和“ xz”。
請註意,僅限壓縮單個csv文件。如果壓縮多個文件,則會發生錯誤。
tsv的讀取
在開始時所寫的那樣,如果要讀取tsv文件(制表符分隔),則可以使用read_table()。
對於如下文件
a b c d
ONE 11 12 13 14
TWO 21 22 23 24
THREE 31 32 33 34
參數與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
通過read_csv()將制表符\t設置為區別符,也可以讀取它。
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
總結
到此這篇關於Python Pandas讀取csv/tsv文件(read_csv,read_table)區別的文章就介紹到這瞭,更多相關Pandas讀取csv/tsv文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python數據處理pandas讀寫操作IO工具CSV解析
- pandas 讀取excel文件的操作代碼
- Python pandas中read_csv參數示例詳解
- python中pandas.read_csv()函數的深入講解
- Python中的pandas表格模塊、文件模塊和數據庫模塊