網(wǎng)站首頁 編程語言 正文
前言
前面我們介紹了 pandas 的基礎(chǔ)語法操作,下面我們開始介紹 pandas 的數(shù)據(jù)讀寫操作。
pandas 的 IO API 是一組頂層的 reader 函數(shù),比如 pandas.read_csv(),會(huì)返回一個(gè) pandas 對象。
而相應(yīng)的 writer 函數(shù)是對象方法,如 DataFrame.to_csv()。
下面列出了所有的 reader 和 writer 函數(shù)
注意:后面會(huì)用到 StringIO,請確保導(dǎo)入
# python3
from io import StringIO
# python2
from StringIO import StringIO
CSV 和文本文件
讀取文本文件的主要函數(shù)是 read_csv()
1 參數(shù)解析
read_csv() 接受以下常用參數(shù):
1.1 基礎(chǔ)
filepath_or_buffer: 變量
可以是文件路徑、文件 URL 或任何帶有 read() 函數(shù)的對象
sep: str,默認(rèn) ,,對于 read_table 是 \t
- 文件分隔符,如果設(shè)置為 None,則 C 引擎無法自動(dòng)檢測分隔符,而 Python 引擎可以通過內(nèi)置的嗅探器工具自動(dòng)檢測分隔符。
- 此外,如果設(shè)置的字符長度大于 1,且不是 '\s+',那么該字符串會(huì)被解析為正則表達(dá)式,且強(qiáng)制使用 Python 解析引擎。
- 例如 '\\r\\t',但是正則表達(dá)式容易忽略文本中的引用數(shù)據(jù)。
delimiter: str, 默認(rèn)為 None
sep 的替代參數(shù),功能一致
1.2 列、索引、名稱
header: int 或 list, 默認(rèn)為 'infer'
用作列名的行號,默認(rèn)行為是對列名進(jìn)行推斷:
- 如果未指定 names 參數(shù)其行為類似于 header=0,即從讀取的第一行開始推斷。
- 如果設(shè)置了 names,則行為與 header=None 相同。
- 也可以為 header 設(shè)置列表,表示多級列名。如 [0,1,3],未指定的行(這里是 2)將會(huì)被跳過,如果 skip_blank_lines=True,則會(huì)跳過空行和注釋的行。因此 header=0 并不是代表文件的第一行
names: array-like, 默認(rèn)為 None
需要設(shè)置的列名列表,如果文件中不包含標(biāo)題行,則應(yīng)顯式傳遞 header=None,且此列表中不允許有重復(fù)值。
index_col: int, str, sequence of int/str, False, 默認(rèn)為 None
- 用作 DataFrame 的索引的列,可以字符串名稱或列索引的形式給出。如果指定了列表,則使用 MultiIndex
- 注意:index_col=False 可用于強(qiáng)制 pandas 不要將第一列用作索引。例如,當(dāng)您的文件是每行末尾都帶有一個(gè)分隔符的錯(cuò)誤文件時(shí)。
usecols: 列表或函數(shù), 默認(rèn)為 None
- 只讀取指定的列。如果是列表,則所有元素都必須是位置(即文件列中的整數(shù)索引)或字符串,這些字符串必須與 names 參數(shù)提供的或從文檔標(biāo)題行推斷出的列名相對應(yīng)。
- 列表中的順序會(huì)被忽略,即 usecols=[0, 1] 等價(jià)于 [1, 0]
- 如果是可調(diào)用函數(shù),將會(huì)根據(jù)列名計(jì)算,返回可調(diào)用函數(shù)計(jì)算為 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
使用此參數(shù)可以大大加快解析時(shí)間并降低內(nèi)存使用
squeeze: boolean, 默認(rèn)為 False
- 如果解析的數(shù)據(jù)只包含一列,那么返回一個(gè) Series
prefix: str, 默認(rèn)為 None
- 當(dāng)沒有標(biāo)題時(shí),添加到自動(dòng)生成的列號的前綴,例如 'X' 表示 X0, X1...
mangle_dupe_cols: boolean, 默認(rèn)為 True
- 重復(fù)的列將被指定為 'X','X.1'…'X.N',而不是 'X'... 。如果在列中有重復(fù)的名稱,傳遞 False 將導(dǎo)致數(shù)據(jù)被覆蓋
1.3 常規(guī)解析配置
dtype: 類型名或類型字典(column -> type), 默認(rèn)為 None
數(shù)據(jù)或列的數(shù)據(jù)類型。例如。
{'a':np.float64,'b':np.int32}
engine: {'c', 'python'}
- 要使用的解析器引擎。C 引擎更快,而 Python 引擎目前功能更完整
converters: dict, 默認(rèn)為 None
- 用于在某些列中對值進(jìn)行轉(zhuǎn)換的函數(shù)字典。鍵可以是整數(shù),也可以是列名
true_values: list, 默認(rèn)為 None
- 數(shù)據(jù)值解析為 True
false_values: list, 默認(rèn)為 None
- 數(shù)據(jù)值解析為 False
skipinitialspace: boolean, 默認(rèn)為 False
- 跳過分隔符之后的空格
skiprows: 整數(shù)或整數(shù)列表, 默認(rèn)為 None
- 在文件開頭要跳過的行號(索引為 0)或要跳過的行數(shù)
- 如果可調(diào)用函數(shù),則對索引應(yīng)用函數(shù),如果返回 True,則應(yīng)跳過該行,否則返回 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, 默認(rèn)為 0
- 需要跳過文件末尾的行數(shù)(不支持 C 引擎)
nrows: int, 默認(rèn)為 None
- 要讀取的文件行數(shù),對于讀取大文件很有用
memory_map: boolean, 默認(rèn)為 False
- 如果為 filepath_or_buffer 參數(shù)指定了文件路徑,則將文件對象直接映射到內(nèi)存中,然后直接從那里訪問數(shù)據(jù)。使用此選項(xiàng)可以提高性能,因?yàn)椴辉儆腥魏?I/O 開銷
1.4 NA 和缺失數(shù)據(jù)處理
na_values: scalar, str, list-like, dict, 默認(rèn)為 None
- 需要轉(zhuǎn)換為 NA 值的字符串
keep_default_na: boolean, 默認(rèn)為 True
解析數(shù)據(jù)時(shí)是否包含默認(rèn)的 NaN 值。根據(jù)是否傳入 na_values,其行為如下
keep_default_na=True, 且指定了 na_values, na_values 將會(huì)與默認(rèn)的 NaN 一起被解析
keep_default_na=True, 且未指定 na_values, 只解析默認(rèn)的 NaN
keep_default_na=False, 且指定了 na_values, 只解析 na_values 指定的 NaN
keep_default_na=False, 且未指定 na_values, 字符串不會(huì)被解析為 NaN
注意:如果 na_filter=False,那么 keep_default_na 和 na_values 參數(shù)將被忽略
na_filter: boolean, 默認(rèn)為 True
- 檢測缺失值標(biāo)記(空字符串和 na_values 的值)。在沒有任何 NA 的數(shù)據(jù)中,設(shè)置 na_filter=False 可以提高讀取大文件的性能
skip_blank_lines: boolean, 默認(rèn)為 True
- 如果為 True,則跳過空行,而不是解釋為 NaN 值
1.5 日期時(shí)間處理
parse_dates: 布爾值、列表或嵌套列表、字典, 默認(rèn)為 False.
- 如果為 True -> 嘗試解析索引
- 如果為 [1, 2, 3] -> 嘗試將 1, 2, 3 列解析為分隔的日期
- 如果為 [[1, 3]] -> 將 1, 3 列解析為單個(gè)日期列
- 如果為 {'foo': [1, 3]} -> 將 1, 3 列作為日期并設(shè)置列名為 foo
infer_datetime_format: 布爾值, 默認(rèn)為 False
- 如果設(shè)置為 True 且設(shè)置了 parse_dates,則嘗試推斷 datetime 格式以加快處理速度
date_parser: 函數(shù), 默認(rèn)為 None
用于將字符串序列轉(zhuǎn)換為日期時(shí)間實(shí)例數(shù)組的函數(shù)。默認(rèn)使用 dateutil.parser.parser 進(jìn)行轉(zhuǎn)換,pandas 將嘗試以三種不同的方式調(diào)用 date_parser
- 傳遞一個(gè)或多個(gè)數(shù)組(parse_dates 定義的列)作為參數(shù);
- 將 parse_dates 定義的列中的字符串值連接到單個(gè)數(shù)組中,并將其傳遞;
- 使用一個(gè)或多個(gè)字符串(對應(yīng)于 parse_dates 定義的列)作為參數(shù),對每一行調(diào)用 date_parser 一次。
dayfirst: 布爾值, 默認(rèn)為 False
- DD/MM 格式的日期
cache_dates: 布爾值, 默認(rèn)為 True
- 如果為 True,則使用唯一的、經(jīng)過轉(zhuǎn)換的日期緩存來應(yīng)用 datetime 轉(zhuǎn)換。
- 在解析重復(fù)的日期字符串,特別是帶有時(shí)區(qū)偏移量的日期字符串時(shí),可能會(huì)顯著提高速度。
1.6 迭代
iterator: boolean, 默認(rèn)為 False
- 返回 TextFileReader 對象以進(jìn)行迭代或使用 get_chunk() 來獲取塊
1.7 引用、壓縮和文件格式
compression: {'infer', 'gzip', 'bz2', 'zip', 'xz', None, dict}, 默認(rèn)為 'infer'
- 用于對磁盤數(shù)據(jù)進(jìn)行即時(shí)解壓縮。如果為 "infer",則如果 filepath_or_buffer 是文件路徑且以 ".gz",".bz2",".zip" 或 ".xz" 結(jié)尾,則分別使用 gzip,bz2,zip 或 xz 解壓,否則不進(jìn)行解壓縮。
- 如果使用 "zip",則 ZIP 文件必須僅包含一個(gè)要讀取的數(shù)據(jù)文件。設(shè)置為 None 表示不解壓
- 也可以使用字典的方式,鍵為 method 的值從 {'zip', 'gzip', 'bz2'} 中選擇。例如
compression={'method': 'gzip', 'compresslevel': 1, 'mtime': 1}
thousandsstr, 默認(rèn)為 None
- 數(shù)值在千位的分隔符
decimal: str, 默認(rèn)為 '.'
- 小數(shù)點(diǎn)
float_precision: string, 默認(rèn)為 None
- 指定 C 引擎應(yīng)該使用哪個(gè)轉(zhuǎn)換器來處理浮點(diǎn)值。普通轉(zhuǎn)換器的選項(xiàng)為 None,高精度轉(zhuǎn)換器的選項(xiàng)為 high,雙向轉(zhuǎn)換器的選項(xiàng)為 round_trip。
quotechar: str (長度為 1)
- 用于表示被引用數(shù)據(jù)的開始和結(jié)束的字符。帶引號的數(shù)據(jù)里的分隔符將被忽略
comment: str, 默認(rèn)為 None
- 用于跳過該字符開頭的行,例如,如果 comment='#',將會(huì)跳過 # 開頭的行
encoding: str, 默認(rèn)為 None
設(shè)置編碼格式
1.8 錯(cuò)誤處理
error_bad_linesboolean, 默認(rèn)為 True
- 默認(rèn)情況下,字段太多的行(例如,帶有太多逗號的 csv 文件)會(huì)引發(fā)異常,并且不會(huì)返回任何 DataFrame。
- 如果設(shè)置為 False,則這些壞行將會(huì)被刪除
warn_bad_linesboolean, 默認(rèn)為 True
如果 error_bad_lines=False 且 warn_bad_lines=True,每個(gè)壞行都會(huì)輸出一個(gè)警告
2. 指定數(shù)據(jù)列的類型
您可以指示整個(gè) DataFrame 或各列的數(shù)據(jù)類型
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 參數(shù),統(tǒng)一某列的數(shù)據(jù)類型
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
或者,您可以在讀取數(shù)據(jù)后使用 to_numeric() 函數(shù)強(qiáng)制轉(zhuǎn)換類型
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
它將所有有效的數(shù)值轉(zhuǎn)換為浮點(diǎn)數(shù),而將無效的解析為 NaN
最后,如何處理包含混合類型的列取決于你的具體需要。在上面的例子中,如果您只想要將異常的數(shù)據(jù)轉(zhuǎn)換為 NaN,那么 to_numeric() 可能是您的最佳選擇。
然而,如果您想要強(qiáng)制轉(zhuǎn)換所有數(shù)據(jù),而無論類型如何,那么使用 read_csv() 的 converters 參數(shù)會(huì)更好
注意
在某些情況下,讀取包含混合類型列的異常數(shù)據(jù)將導(dǎo)致數(shù)據(jù)集不一致。
如果您依賴 pandas 來推斷列的類型,解析引擎將繼續(xù)推斷數(shù)據(jù)塊的類型,而不是一次推斷整個(gè)數(shù)據(jù)集。
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')
這就導(dǎo)致 mixed_df 對于列的某些塊包含 int 類型,而對于其他塊則包含 str,這是由于讀取的數(shù)據(jù)是混合類型。
原文鏈接:https://www.jianshu.com/p/5b85a9b872b8
相關(guān)推薦
- 2024-03-18 bootstrap application 和 nacos 中配置文件的優(yōu)先級
- 2021-12-02 C++?函數(shù)的介紹_C 語言
- 2022-08-16 C++深入了解模板的使用_C 語言
- 2022-12-21 kubernetes?k8s?存儲(chǔ)動(dòng)態(tài)掛載配置詳解_云其它
- 2022-07-06 C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程_C 語言
- 2022-10-19 Pandas如何對Categorical類型字段數(shù)據(jù)統(tǒng)計(jì)實(shí)戰(zhàn)案例_python
- 2023-01-12 利用C#實(shí)現(xiàn)進(jìn)程管理器_C#教程
- 2022-10-29 微服務(wù)啟動(dòng)報(bào)錯(cuò):No Feign Client for loadBalancing defined.
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支