Python 數據處理(十三)—— IO 工具之 CSV

2021-02-16 生信學習手冊
Python 數據處理(十三)—— IO 工具前言

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

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

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

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

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

# python3
from io import StringIO
# python2
from StringIO import StringIO

1 CSV 和文本文件

讀取文本文件的主要函數是 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

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 pd

In [2]: from io import StringIO

In [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  col3
0    a    b     1
1    a    b     2
2    c    d     3

In [5]: pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ["COL1", "COL3"])
Out[5]: 
  col1  col3
0    a     1
1    a     2
2    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

false_values: list, 默認為 None

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  col3
0    a    b     1
1    a    b     2
2    c    d     3

In [8]: pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)
Out[8]: 
  col1 col2  col3
0    a    b     2

skipfooter: int, 默認為 0

nrows: int, 默認為 None

memory_map: boolean, 默認為 False

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

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

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.

如果為 [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

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。

warn_bad_linesboolean, 默認為 True

如果 error_bad_lines=False 且 warn_bad_lines=True,每個壞行都會輸出一個警告2. 指定數據列的類型

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

In [9]: import numpy as np

In [10]: data = "a,b,c,d\n1,2,3,4\n5,6,7,8\n9,10,11"

In [11]: print(data)
a,b,c,d
1,2,3,4
5,6,7,8
9,10,11

In [12]: df = pd.read_csv(StringIO(data), dtype=object)

In [13]: df
Out[13]: 
   a   b   c    d
0  1   2   3    4
1  5   6   7    8
2  9  10  11  NaN

In [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.dtypes
Out[16]: 
a      int64
b     object
c    float64
d      Int64
dtype: 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]: df
Out[19]: 
  col_1
0     1
1     2
2   'A'
3  4.22

In [20]: df["col_1"].apply(type).value_counts()
Out[20]: 
<class 'str'>    4
Name: 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]: df2
Out[23]: 
   col_1
0   1.00
1   2.00
2    NaN
3   4.22

In [24]: df2["col_1"].apply(type).value_counts()
Out[24]: 
<class 'float'>    4
Name: 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'>    262144
Name: col_1, dtype: int64

In [30]: mixed_df["col_1"].dtype
Out[30]: dtype('O')

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

相關焦點

  • Python 數據處理(十四)—— IO 工具 CSV示例
    Python 數據處理(十四)3 分類類型分類類型可以通過指定 dtype='category' 或 dtype=CategoricalDtype(categories, ordered) 直接解析In [31]: data = "col1,col2,col3\na,b,1\na
  • Python處理CSV文件
    在數據處理過程中,可能會需要採用篩選、提取、重新生成等方法來對數據進行處理,下面以csv文件為例,介紹使用Python處理文本文件的方法。開始之前在面對文件讀寫類的問題時,open函數是一定繞不開的,下面先介紹幾種open函數使用的技巧。
  • Python對CSV文件的處理
    /usr/bin/env python #-*-coding:utf-8-*-#author:wuyaimport  csvdef readCsv(): with open('csvTest.csv','r') as f: rander=csv.reader(f) #對數據循環獲取
  • python-pandas讀寫csv數據
    https://pandas.pydata.org/pandas-docs/stable/https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
  • 基於Python實現對各種數據文件的操作
    常見的數據文件類型如下:txtcsvexcel(xls\xlsx)在線網頁數據pdf\word其他數據軟體格式1 txt文件更多參考:https://docs.python.org/3/tutorial/inputoutput.html
  • Python學習第93課-導入csv數據並繪製折線圖
    【每天幾分鐘,從零入門python編程的世界!】之前我們畫各種圖,都是把需要分析的數據,手寫輸入Python的開發工具中去的,這樣做是為了學習和理解Python數據可視化畫圖的原理,但是在實際工作中,我們一定是去處理Python開發工具之外的一些數據,比如Excel表格保存的數據,或者其他格式的文件保存的數據。
  • Python爬蟲 | 0xc - 數據存儲:CSV和Excel
    CSV(Comma-Separated Values,逗號分隔值) 以純文本形式存儲表格數據(數字和文本),記錄間以某種換行符分隔。跟我們上面用-作為分隔符保存數據非常類似,CSV文件除了可以用普通文本編輯工具打開外,還可使用Excel打開。Python中內置一個csv模塊供我們處理CSV文件。
  • Python入門教程Python處理CSV、JSON和XML數據的簡便方法
    Python的卓越靈活性和易用性使其成為最受歡迎的程式語言之一,尤其是對於數據處理和機器學習方面來說,其強大的數據處理庫和算法庫使得python成為入門數據科學的首選語言。在日常使用中,CSV,JSON和XML三種數據格式佔據主導地位。下面我將針對三種數據格式來分享其快速處理的方法。CSV數據CSV是存儲數據的最常用方法。
  • Python 數據處理(十六)
    Python 數據處理(十六)10 指定浮點數轉換方法可以在 C 引擎解析期間使用 float_precision 參數來指定浮點數轉換器該參數有三個可選的值:round_trip: 保證文件讀寫之後小數點精度不變In [
  • 如何快速學會Python處理數據?(5000字走心總結)
    所以,要利用工作之餘的時間,把python基礎打紮實。2 Python數據處理示例 2.1  安裝並搭建python環境首先,需要安裝python,我要推薦Anaconda3,從事數據分析的夥伴們,嚴重推薦此軟體!
  • Python3 使用csv模塊處理CSV(逗號分割的值)格式存儲的天氣數據
    datetime模塊因為csv格式文件中含有日期格式, 我們使用datetime模塊來解析.模塊處理文件代碼中使用到csv文件, 本文末尾有下載連結分析sitkaweather07-2014.csv文件highs_lows.pyimport csvfrom datetime import datetimefrom matplotlib import pyplot as plt# 從文件中獲取每天的最高溫度
  • 3招Python 處理CSV、JSON和XML數據的簡便方法!
    Python的卓越靈活性和易用性使其成為最受歡迎的程式語言之一,尤其是對於數據處理和機器學習方面來說,其強大的數據處理庫和算法庫使得python成為入門數據科學的首選語言。在日常使用中,CSV,JSON和XML三種數據格式佔據主導地位。下面我將針對三種數據格式來分享其快速處理的方法。CSV是存儲數據的最常用方法。在Kaggle比賽的大部分數據都是以這種方式存儲的。
  • Python數學建模技巧之pandas數據處理
    歷年美賽C題都是關於大數據的題目,再結合近年來大數據處理技術在社會各行各業中應用得越來越普遍,今年的這則通知可能預示著今年C題的數據量會更大。既然提前將數據集公布了出來,準備做C題的隊伍肯定都是會在賽前就將數據集進行一些基本的預處理,包括數據清洗、數據集成、數據轉換、數據規約、數據離散化等操作,甚至在不知道題目的情況下就嘗試著用一些數據挖掘的算法去試圖發現一些數據集中所包含的潛在規律。基本工具Excel肯定沒法去完成這些複雜的數據處理任務,而用matlab去完成這些任務的話,又會極為繁瑣複雜和不方便。
  • CSV文件在Python中的幾種處理方式
    for row in fr:    row = row.strip()    row_list = row.split(",")    fw.write(",".join(map(str, header_list)) + "\n")以上步驟完成後,在命令提示符中輸入:python csvrw.py
  • Python讀寫csv文件專題教程(2)
    'gz' 10 011 2 'lh' 12 02這樣才能符合我們的預期enginePandas目前的解析引擎提供兩種:c, python,默認為c, 因為c引擎解析速度更快,但是特性沒有python引擎高,如果使用c引擎沒有的特性時,會自動退化為python引擎。
  • python教程實戰,json、csv等讀寫
    { "key": ["a", "b", "sojson.com"]}{ "title": "python 入門", "type": "新手入門", "本篇內容": [ "JSON描述", "JSON數據讀取", "JSON數據構造", "CSV", { "office": [
  • 常用的十大 python 圖像處理工具
    圖片來自 Pexels 的Luriko Yamaguchi今天,在我們的世界裡充滿了數據,圖像成為構成這些數據的重要組成部分。Python成為這種圖像處理任務是一個恰當選擇,這是因為它作為一種科學程式語言正在日益普及,並且在其生態系統中免費提供許多最先進的圖像處理工具供大家使用。讓我們看一下可以用於圖像處理任務中的常用 Python 庫有哪些吧。
  • python學習筆記 - 讀寫CSV文件
    python三方庫提供了csv庫,我們需要通過這個庫,來實現對CSV文件的讀與寫。所以我們在應用csv庫之前,需要提前安裝它。= DictReader(csv_file)那麼此時csv文件中當數據應該是這樣的,第一行數據認定為標題行,後續需要獲取數據的時候,程序從第二行開始獲取:
  • 大數據下Python的三款大數據分析工具
    導讀:Python在大數據領域中被常用已經不是什麼稀奇事。現在讓我們了解三個Python工具/庫來處理自己的大數據。
  • Python 簡單操作 CSV
    前言這次梳理的篇幅主要是涉及CSV以及如何通過python對CSV進行操作等,對鞏固自己的python知識也是很有幫助的,進一步的對CSV的使用而言也是幫助很大的