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

Python?Pandas讀取csv/tsv文件(read_csv,read_table)的區(qū)別

 更新時(shí)間:2022年01月06日 15:25:37   作者:餃子大人  
這篇文章主要給大家介紹了關(guān)于Python?Pandas讀取csv/tsv文件(read_csv,read_table)區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

要將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)文章

最新評(píng)論