程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python數據處理pandas讀寫操作IO工具CSV解析

編輯:Python

目錄

前言

CSV 和文本文件

1 參數解析

1.1 基礎

1.2 列、索引、名稱

1.3 常規解析配置

1.4 NA 和缺失數據處理

1.5 日期時間處理

1.6 迭代

1.7 引用、壓縮和文件格式

1.8 錯誤處理

2. 指定數據列的類型

前言

前面我們介紹了 pandas 的基礎語法操作,下面我們開始介紹 pandas 的數據讀寫操作。

pandas 的 IO API 是一組頂層的 reader 函數,比如 pandas.read_csv(),會返回一個 pandas 對象。

而相應的 writer 函數是對象方法,如 DataFrame.to_csv()。

下面列出了所有的 reader 和 writer 函數

注意:後面會用到 StringIO,請確保導入

# python3from io import StringIO# python2from StringIO import StringIOCSV 和文本文件

讀取文本文件的主要函數是 read_csv()

1 參數解析

read_csv() 接受以下常用參數:

1.1 基礎

filepath_or_buffer: 變量

可以是文件路徑、文件 URL 或任何帶有 read() 函數的對象

sep: str,默認 ,,對於 read_table 是 \t

文件分隔符,如果設置為 None,則 C 引擎無法自動檢測分隔符,而 Python 引擎可以通過內置的嗅探器工具自動檢測分隔符。

此外,如果設置的字符長度大於 1,且不是 '\s+',那麼該字符串會被解析為正則表達式,且強制使用 Python 解析引擎。

例如 '\\r\\t',但是正則表達式容易忽略文本中的引用數據。

delimiter: str, 默認為 None

sep 的替代參數,功能一致

1.2 列、索引、名稱

header: int 或 list, 默認為 'infer'

用作列名的行號,默認行為是對列名進行推斷:

如果未指定 names 參數其行為類似於 header=0,即從讀取的第一行開始推斷。

如果設置了 names,則行為與 header=None 相同。

也可以為 header 設置列表,表示多級列名。如 [0,1,3],未指定的行(這裡是 2)將會被跳過,如果 skip_blank_lines=True,則會跳過空行和注釋的行。因此 header=0 並不是代表文件的第一行

names: array-like, 默認為 None

需要設置的列名列表,如果文件中不包含標題行,則應顯式傳遞 header=None,且此列表中不允許有重復值。

index_col: int, str, sequence of int/str, False, 默認為 None

用作 DataFrame 的索引的列,可以字符串名稱或列索引的形式給出。如果指定了列表,則使用 MultiIndex

注意:index_col=False 可用於強制 pandas 不要將第一列用作索引。例如,當您的文件是每行末尾都帶有一個分隔符的錯誤文件時。

usecols: 列表或函數, 默認為 None

只讀取指定的列。如果是列表,則所有元素都必須是位置(即文件列中的整數索引)或字符串,這些字符串必須與 names 參數提供的或從文檔標題行推斷出的列名相對應。

列表中的順序會被忽略,即 usecols=[0, 1] 等價於 [1, 0]

如果是可調用函數,將會根據列名計算,返回可調用函數計算為 True 的名稱

In [1]: import pandas as pdIn [2]: from io import StringIOIn [3]: data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"In [4]: pd.read_csv(StringIO(data))Out[4]: col1 col2 col30 a b 11 a b 22 c d 3In [5]: pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ["COL1", "COL3"])Out[5]: col1 col30 a 11 a 22 c 3

使用此參數可以大大加快解析時間並降低內存使用

squeeze: boolean, 默認為 False

如果解析的數據只包含一列,那麼返回一個 Series

prefix: str, 默認為 None

當沒有標題時,添加到自動生成的列號的前綴,例如 'X' 表示 X0, X1...

mangle_dupe_cols: boolean, 默認為 True

重復的列將被指定為 'X','X.1'…'X.N',而不是 'X'... 。如果在列中有重復的名稱,傳遞 False 將導致數據被覆蓋

1.3 常規解析配置

dtype: 類型名或類型字典(column -> type), 默認為 None

數據或列的數據類型。例如。

{'a':np.float64,'b':np.int32}

engine: {'c', 'python'}

要使用的解析器引擎。C 引擎更快,而 Python 引擎目前功能更完整

converters: dict, 默認為 None

用於在某些列中對值進行轉換的函數字典。鍵可以是整數,也可以是列名

true_values: list, 默認為 None

數據值解析為 True

false_values: list, 默認為 None

數據值解析為 False

skipinitialspace: boolean, 默認為 False

跳過分隔符之後的空格

skiprows: 整數或整數列表, 默認為 None

在文件開頭要跳過的行號(索引為 0)或要跳過的行數

如果可調用函數,則對索引應用函數,如果返回 True,則應跳過該行,否則返回 False

In [6]: data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"In [7]: pd.read_csv(StringIO(data))Out[7]: col1 col2 col30 a b 11 a b 22 c d 3In [8]: pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)Out[8]: col1 col2 col30 a b 2

skipfooter: int, 默認為 0

需要跳過文件末尾的行數(不支持 C 引擎)

nrows: int, 默認為 None

要讀取的文件行數,對於讀取大文件很有用

memory_map: boolean, 默認為 False

如果為 filepath_or_buffer 參數指定了文件路徑,則將文件對象直接映射到內存中,然後直接從那裡訪問數據。使用此選項可以提高性能,因為不再有任何 I/O 開銷

1.4 NA 和缺失數據處理

na_values: scalar, str, list-like, dict, 默認為 None

需要轉換為 NA 值的字符串

keep_default_na: boolean, 默認為 True

解析數據時是否包含默認的 NaN 值。根據是否傳入 na_values,其行為如下

keep_default_na=True, 且指定了 na_values, na_values 將會與默認的 NaN 一起被解析

keep_default_na=True, 且未指定 na_values, 只解析默認的 NaN

keep_default_na=False, 且指定了 na_values, 只解析 na_values 指定的 NaN

keep_default_na=False, 且未指定 na_values, 字符串不會被解析為 NaN

注意:如果 na_filter=False,那麼 keep_default_na 和 na_values 參數將被忽略

na_filter: boolean, 默認為 True

檢測缺失值標記(空字符串和 na_values 的值)。在沒有任何 NA 的數據中,設置 na_filter=False 可以提高讀取大文件的性能

skip_blank_lines: boolean, 默認為 True

如果為 True,則跳過空行,而不是解釋為 NaN 值

1.5 日期時間處理

parse_dates: 布爾值、列表或嵌套列表、字典, 默認為 False.

如果為 True -> 嘗試解析索引

如果為 [1, 2, 3] -> 嘗試將 1, 2, 3 列解析為分隔的日期

如果為 [[1, 3]] -> 將 1, 3 列解析為單個日期列

如果為 {'foo': [1, 3]} -> 將 1, 3 列作為日期並設置列名為 foo

infer_datetime_format: 布爾值, 默認為 False

如果設置為 True 且設置了 parse_dates,則嘗試推斷 datetime 格式以加快處理速度

date_parser: 函數, 默認為 None

用於將字符串序列轉換為日期時間實例數組的函數。默認使用 dateutil.parser.parser 進行轉換,pandas 將嘗試以三種不同的方式調用 date_parser

傳遞一個或多個數組(parse_dates 定義的列)作為參數;

將 parse_dates 定義的列中的字符串值連接到單個數組中,並將其傳遞;

使用一個或多個字符串(對應於 parse_dates 定義的列)作為參數,對每一行調用 date_parser 一次。

dayfirst: 布爾值, 默認為 False

DD/MM 格式的日期

cache_dates: 布爾值, 默認為 True

如果為 True,則使用唯一的、經過轉換的日期緩存來應用 datetime 轉換。

在解析重復的日期字符串,特別是帶有時區偏移量的日期字符串時,可能會顯著提高速度。

1.6 迭代

iterator: boolean, 默認為 False

返回 TextFileReader 對象以進行迭代或使用 get_chunk() 來獲取塊

1.7 引用、壓縮和文件格式

compression: {'infer', 'gzip', 'bz2', 'zip', 'xz', None, dict}, 默認為 'infer'

用於對磁盤數據進行即時解壓縮。如果為 "infer",則如果 filepath_or_buffer 是文件路徑且以 ".gz",".bz2",".zip" 或 ".xz" 結尾,則分別使用 gzip,bz2,zip 或 xz 解壓,否則不進行解壓縮。

如果使用 "zip",則 ZIP 文件必須僅包含一個要讀取的數據文件。設置為 None 表示不解壓

也可以使用字典的方式,鍵為 method 的值從 {'zip', 'gzip', 'bz2'} 中選擇。例如

compression={'method': 'gzip', 'compresslevel': 1, 'mtime': 1}

thousandsstr, 默認為 None

數值在千位的分隔符

decimal: str, 默認為 '.'

小數點

float_precision: string, 默認為 None

指定 C 引擎應該使用哪個轉換器來處理浮點值。普通轉換器的選項為 None,高精度轉換器的選項為 high,雙向轉換器的選項為 round_trip。

quotechar: str (長度為 1)

用於表示被引用數據的開始和結束的字符。帶引號的數據裡的分隔符將被忽略

comment: str, 默認為 None

用於跳過該字符開頭的行,例如,如果 comment='#',將會跳過 # 開頭的行

encoding: str, 默認為 None

設置編碼格式

1.8 錯誤處理

error_bad_linesboolean, 默認為 True

默認情況下,字段太多的行(例如,帶有太多逗號的 csv 文件)會引發異常,並且不會返回任何 DataFrame。

如果設置為 False,則這些壞行將會被刪除

warn_bad_linesboolean, 默認為 True

如果 error_bad_lines=False 且 warn_bad_lines=True,每個壞行都會輸出一個警告

2. 指定數據列的類型

您可以指示整個 DataFrame 或各列的數據類型

In [9]: import numpy as npIn [10]: data = "a,b,c,d\n1,2,3,4\n5,6,7,8\n9,10,11"In [11]: print(data)a,b,c,d1,2,3,45,6,7,89,10,11In [12]: df = pd.read_csv(StringIO(data), dtype=object)In [13]: dfOut[13]: a b c d0 1 2 3 41 5 6 7 82 9 10 11 NaNIn [14]: df["a"][0]Out[14]: '1'In [15]: df = pd.read_csv(StringIO(data), dtype={"b": object, "c": np.float64, "d": "Int64"})In [16]: df.dtypesOut[16]: a int64b objectc float64d Int64dtype: object

你可以使用 read_csv() 的 converters 參數,統一某列的數據類型

In [17]: data = "col_1\n1\n2\n'A'\n4.22"In [18]: df = pd.read_csv(StringIO(data), converters={"col_1": str})In [19]: dfOut[19]: col_10 11 22 'A'3 4.22In [20]: df["col_1"].apply(type).value_counts()Out[20]: <class 'str'> 4Name: col_1, dtype: int64

或者,您可以在讀取數據後使用 to_numeric() 函數強制轉換類型

In [21]: df2 = pd.read_csv(StringIO(data))In [22]: df2["col_1"] = pd.to_numeric(df2["col_1"], errors="coerce")In [23]: df2Out[23]: col_10 1.001 2.002 NaN3 4.22In [24]: df2["col_1"].apply(type).value_counts()Out[24]: <class 'float'> 4Name: col_1, dtype: int64

它將所有有效的數值轉換為浮點數,而將無效的解析為 NaN

最後,如何處理包含混合類型的列取決於你的具體需要。在上面的例子中,如果您只想要將異常的數據轉換為 NaN,那麼 to_numeric() 可能是您的最佳選擇。

然而,如果您想要強制轉換所有數據,而無論類型如何,那麼使用 read_csv() 的 converters 參數會更好

注意

在某些情況下,讀取包含混合類型列的異常數據將導致數據集不一致。

如果您依賴 pandas 來推斷列的類型,解析引擎將繼續推斷數據塊的類型,而不是一次推斷整個數據集。

In [25]: col_1 = list(range(500000)) + ["a", "b"] + list(range(500000))In [26]: df = pd.DataFrame({"col_1": col_1})In [27]: df.to_csv("foo.csv")In [28]: mixed_df = pd.read_csv("foo.csv")In [29]: mixed_df["col_1"].apply(type).value_counts()Out[29]: <class 'int'> 737858<class 'str'> 262144Name: col_1, dtype: int64In [30]: mixed_df["col_1"].dtypeOut[30]: dtype('O')

這就導致 mixed_df 對於列的某些塊包含 int 類型,而對於其他塊則包含 str,這是由於讀取的數據是混合類型。

以上就是Python pandas數據讀寫操作IO工具CSV的詳細內容,更多關於Python pandas數據讀寫的資料請關注軟件開發網其它相關文章!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved