python csv pandas_Python Pandas——Read_csv詳解

目前最常用的數據保存格式可能就是CSV格式了,數據分析第一步就是獲取數據,怎樣讀取數據至關重要。

本文將以pandas read_csv方法為例,詳細介紹read_csv數據讀取方法。再數據讀取時進行數據預處理,這樣不僅可以加快讀取速度,同時為后期數據清洗及分析打下基礎。

導入必要的庫

import pandas as pd

import numpy as np

from pandas.api.types import CategoricalDtype

from io import StringIO

Specifying Column Data Types

可以指定整個DataFrame或各個列的數據類型:

data = pd.read_csv('diamonds.csv',dtype=object)

data.head()

out:

caratcutcolorclaritydepthtablepricexyz

00.23IdealESI261.5553263.953.982.43

10.21PremiumESI159.8613263.893.842.31

20.23GoodEVS156.9653274.054.072.31

30.29PremiumIVS262.4583344.24.232.63

40.31GoodJSI263.3583354.344.352.75

data.dtypes

out:

carat object

cut object

color object

clarity object

depth object

table object

price object

x object

y object

z object

dtype: object

data = pd.read_csv('diamonds.csv',dtype={'carat': np.float64,'depth': np.float64,'table':np.float64})

data.dtypes

out:

carat float64

cut object

color object

clarity object

depth float64

table float64

price int64

x float64

y float64

z float64

dtype: object

pandas提供了多種方法來確保列僅包含一個dtype。例如,可以使用read_csv()的converters參數:

data = pd.read_csv('diamonds.csv',converters={'carat':str})

data.dtypes

out:

carat object

cut object

color object

clarity object

depth float64

table float64

price int64

x float64

y float64

z float64

dtype: object

data.carat.apply(type).value_counts()

out:

53940

Name: carat, dtype: int64

或者,可以在讀取數據后使用to_numeric()函數強進行類型轉換。

data.carat = pd.to_numeric(data['carat'],errors='coerce')

data.carat.apply(type).value_counts()

out:

53940

Name: carat, dtype: int64

Specigying Categorical Dtype?

可以通過指定dtype ='category'或dtype = CategoricalDtype(類別,有序)直接解析類別列。

data = pd.read_csv('diamonds.csv',dtype='category')

data.dtypes

out:

carat category

cut category

color category

clarity category

depth category

table category

price category

x category

y category

z category

dtype: object

可以使用dict指定將某列為Category類型:

data = pd.read_csv('diamonds.csv',dtype={'cut':'category'})

data.dtypes

out:

carat float64

cut category

color object

clarity object

depth float64

table float64

price int64

x float64

y float64

z float64

dtype: object

data.cut.value_counts()

out:

Ideal 21551

Premium 13791

Very Good 12082

Good 4906

Fair 1610

Name: cut, dtype: int64

指定dtype ='category'將導致無序分類,其類別是數據中觀察到的唯一值。

要更好地控制類別和順序,可以創建CategoricalDtype,然后將其傳遞給該列的dtype。

from pandas.api.types import CategoricalDtype

dtype = CategoricalDtype(['Ideal','Premium','Very Good','Good','Fair'],ordered=True)

data = pd.read_csv('diamonds.csv',dtype={'cut':dtype})

data.dtypes

out:

carat float64

cut category

color object

clarity object

depth float64

table float64

price int64

x float64

y float64

z float64

dtype: object

使用dtype = CategoricalDtype時,dtype.categories之外的“意外”值將被視為缺失值。

from pandas.api.types import CategoricalDtype

dtype = CategoricalDtype(['Ideal','Premium','Very Good','Good'],ordered=True)

data = pd.read_csv('diamonds.csv',dtype={'cut':dtype})

data[data.cut.isnull()].head()

out:

caratcutcolorclaritydepthtablepricexyz

80.22NaNEVS265.161.03373.873.782.49

910.86NaNESI255.169.027576.456.333.52

970.96NaNFSI266.362.027596.275.954.07

1230.70NaNFVS264.557.027625.575.533.58

1240.70NaNFVS265.355.027625.635.583.66

Naming and Using Columns

Handling Column names

文件可能包含標題行,也可能沒有標題行。 pandas假定第一行應用作列名:

from io import StringIO

data = ('a,b,c\n'

'1,2,3\n'

'4,5,6\n'

'7,8,9')

pd.read_csv(StringIO(data))

out:

abc

0123

1456

2789

通過指定name與header,可以重命名列以及是否丟棄標題行:

pd.read_csv(StringIO(data),names=['foo','bar','baz'],header=0)

out:

foobarbaz

0123

1456

2789

pd.read_csv(StringIO(data),names=['foo','bar','baz'],header=None)

out:

foobarbaz

0abc

1123

2456

3789

如果標題不在第一行中,則將行號傳遞給標題,將跳過header前面的行:

data = ('skip this skip it\n'

'a,b,c\n'

'1,2,3\n'

'4,5,6\n'

'7,8,9')

pd.read_csv(StringIO(data),header=1)

out:

abc

0123

1456

2789

Duplicate Names Parsing

如果文件或標題包含重復的名稱,默認情況下,pandas會將它們區分開,以防止覆蓋數據.

data = ('a,b,a\n'

'0,1,2\n'

'3,4,5')

print(data)

out:

a,b,a

0,1,2

3,4,5

pd.read_csv(StringIO(data))

out:

aba.1

0012

1345

Filtering Columns(usecols)

usecols參數允許您使用列名,位置號或可調用的方法選擇文件中列的任何子集.

data = 'a,b,c,d\n1,2,3,foo\n4,5,6,bar\n7,8,9,baz'

pd.read_csv(StringIO(data))

out:

abcd

0123foo

1456bar

2789baz

pd.read_csv(StringIO(data),usecols=['b','d'])

out:

bd

02foo

15bar

28baz

pd.read_csv(StringIO(data),usecols=[0,1,3])

out:

abd

012foo

145bar

278baz

pd.read_csv(StringIO(data),usecols=lambda x: x.upper() in ['A','C'])

out:

ac

013

146

279

pd.read_csv(StringIO(data),usecols=lambda x: x.upper() not in ['A','C'])

out:

bd

02foo

15bar

28baz

Comments and Empty Lines

Ignoring Line Comments And Empty Lines

如果指定了comment參數,則將忽略注釋行。 默認情況下,空行也將被忽略。

data = ('\n'

'a,b,c\n'

'\n'

'# commented line\n'

'1,2,3\n'

'\n'

'4,5,6')

print(data)

out:

a,b,c

# commented line

1,2,3

4,5,6

pd.read_csv(StringIO(data),comment='#')

out:

abc

0123

1456

如果skip_blank_lines = False,則read_csv將不會忽略空行:

pd.read_csv(StringIO(data),comment='#',skip_blank_lines=False)

out:

abc

NaNNaN

123

NaNNaNNaN

456

警告:被忽略的行的存在可能會導致涉及行號的歧義; 參數標題使用行號(忽略注釋/空行),而行首使用行號(包括注釋/空行).

data = ('#comment\n'

'a,b,c\n'

'A,B,C\n'

'1,2,3')

pd.read_csv(StringIO(data),comment='#',header=1)

out:

ABC

0123

pd.read_csv(StringIO(data),comment='#',skiprows=2)

ABC

0123

如果同時指定了skiprows和header,則header將相對于skiprows的末尾。 例如:

data = ('# empty\n'

'# second empty line\n'

'# third emptyline\n'

'X,Y,Z\n'

'1,2,3\n'

'A,B,C\n'

'1,2.,4.\n'

'5.,NaN,10.0\n')

print(data)

out:

# empty

# second empty line

# third emptyline

X,Y,Z

1,2,3

A,B,C

1,2.,4.

5.,NaN,10.0

pd.read_csv(StringIO(data),comment='#',skiprows=4,header=1)

out:

ABC

01.02.04.0

15.0NaN10.0

pd.read_csv(StringIO(data),skiprows=4,header=1)

out:

ABC

01.02.04.0

15.0NaN10.0

Comments

tmp = ('ID,level,category\n'

'Patient1,123000,x # really unpleasant\n'

'Patient2,23000,y # wouldn\'t take his medicine\n'

'Patient3,1234018,z # awesome')

pd.read_csv(StringIO(tmp))

out:

IDlevelcategory

0Patient1123000x # really unpleasant

1Patient223000y # wouldn't take his medicine

2Patient31234018z # awesome

pd.read_csv(StringIO(tmp),comment='#')

out:

IDlevelcategory

0Patient1123000x

1Patient223000y

2Patient31234018z

Index Columns And Trailing Delimiters

data = ('a,b,c\n'

'4,apple,bat,5.7\n'

'8,orange,cow,10')

pd.read_csv(StringIO(data))

out:

abc

4applebat5.7

8orangecow10.0

pd.read_csv(StringIO(data),index_col=0)

out:

abc

4applebat5.7

8orangecow10.0

data = ('a,b,c\n'

'4,apple,bat\n'

'8,orange,cow')

pd.read_csv(StringIO(data))

out:

abc

04applebat

18orangecow

pd.read_csv(StringIO(data),index_col=0)

out:

bc

a

4applebat

8orangecow

pd.read_csv(StringIO(data),usecols=['b','c'])

out:

bc

0applebat

1orangecow

pd.read_csv(StringIO(data),usecols=['b','c'],index_col=0)

out:

c

b

applebat

orangecow

Date Handling

Specifying Date Columns

為了更好地使用日期時間數據,read_csv()使用關鍵字參數parse_dates和date_parser允許用戶指定列的日期/時間格式,將string轉換為日期時間對象。

foo = ('date,A,B,C\n'

'2009-01-01,a,1,2\n'

'2009-01-02,b,3,4\n'

'2009-01-03,c,4,5\n')

pd.read_csv(StringIO(foo),index_col=0,parse_dates=True)

out:

ABC

date

2009-01-01a12

2009-01-02b34

2009-01-03c45

pd.read_csv(StringIO(foo),index_col=0,parse_dates=True).index

DatetimeIndex(['2009-01-01', '2009-01-02', '2009-01-03'], dtype='datetime64[ns]', name='date', freq=None)

通常,我們可能希望分別存儲日期和時間數據,或分別存儲各種日期字段。 parse_dates關鍵字可用于指定列的組合,以從中解析日期和/或時間。 您可以指定要parse_dates的列或嵌套列表,結果日期列將被添加到輸出的前面(以便不影響現有的列順序),新的列名為各列Name的連接。

tmp = ('KORD,19990127, 19:00:00, 18:56:00, 0.8100\n'

'KORD,19990127, 20:00:00, 19:56:00, 0.0100\n'

'KORD,19990127, 21:00:00, 20:56:00, -0.5900\n'

'KORD,19990127, 21:00:00, 21:18:00, -0.9900\n'

'KORD,19990127, 22:00:00, 21:56:00, -0.5900\n'

'KORD,19990127, 23:00:00, 22:56:00, -0.5900')

pd.read_csv(StringIO(tmp),header=None,parse_dates=[[1,2],[1,3]])

out:

1_21_304

01999-01-27 19:00:001999-01-27 18:56:00KORD0.81

11999-01-27 20:00:001999-01-27 19:56:00KORD0.01

21999-01-27 21:00:001999-01-27 20:56:00KORD-0.59

31999-01-27 21:00:001999-01-27 21:18:00KORD-0.99

41999-01-27 22:00:001999-01-27 21:56:00KORD-0.59

51999-01-27 23:00:001999-01-27 22:56:00KORD-0.59

默認情況下,解析器會刪除組件日期列,可以選擇通過keep_date_col關鍵字保留它們:

pd.read_csv(StringIO(tmp),header=None,parse_dates=[[1,2],[1,3]],keep_date_col=True)

out:

1_21_301234

01999-01-27 19:00:001999-01-27 18:56:00KORD1999012719:00:0018:56:000.81

11999-01-27 20:00:001999-01-27 19:56:00KORD1999012720:00:0019:56:000.01

21999-01-27 21:00:001999-01-27 20:56:00KORD1999012721:00:0020:56:00-0.59

31999-01-27 21:00:001999-01-27 21:18:00KORD1999012721:00:0021:18:00-0.99

41999-01-27 22:00:001999-01-27 21:56:00KORD1999012722:00:0021:56:00-0.59

51999-01-27 23:00:001999-01-27 22:56:00KORD1999012723:00:0022:56:00-0.59

請注意,如果您希望將多個列合并為一個日期列,則必須使用嵌套列表。 換句話說,parse_dates = [1,2]表示第二和第三列應分別解析為單獨的日期列,而parse_dates = [[1,2]]意味著應將這兩列解析為單個列。

還可以使用字典來指定自定義名稱列:

date_spec = {'nominal':[1,2],'actual':[1,3]}

pd.read_csv(StringIO(tmp),header=None,parse_dates=date_spec)

out:

nominalactual04

01999-01-27 19:00:001999-01-27 18:56:00KORD0.81

11999-01-27 20:00:001999-01-27 19:56:00KORD0.01

21999-01-27 21:00:001999-01-27 20:56:00KORD-0.59

31999-01-27 21:00:001999-01-27 21:18:00KORD-0.99

41999-01-27 22:00:001999-01-27 21:56:00KORD-0.59

51999-01-27 23:00:001999-01-27 22:56:00KORD-0.59

重要的是要記住,如果要將多個文本列解析為單個日期列,則在數據前添加一個新列。

index_col參數基于這組新列而不是原始數據列:

pd.read_csv(StringIO(tmp),header=None,parse_dates=date_spec,index_col=0)

out:

actual04

nominal

1999-01-27 19:00:001999-01-27 18:56:00KORD0.81

1999-01-27 20:00:001999-01-27 19:56:00KORD0.01

1999-01-27 21:00:001999-01-27 20:56:00KORD-0.59

1999-01-27 21:00:001999-01-27 21:18:00KORD-0.99

1999-01-27 22:00:001999-01-27 21:56:00KORD-0.59

1999-01-27 23:00:001999-01-27 22:56:00KORD-0.59

注意:如果列或索引包含不可解析的日期,則整個列或索引將作為對象數據類型原樣返回。 對于非標準日期時間解析,請在pd.read_csv之后使用to_datetime()。

注意:read_csv具有用于解析iso8601格式的日期時間字符串的fast_path,例如“ 2000-01-01T00:01:02 + 00:00”和類似的變體。 如果可以安排數據以這種格式存儲日期時間,則加載時間將明顯縮短,約20倍。

Date Parsing Functions

最后,解析器允許您指定自定義date_parser函數,以充分利用日期解析API的靈活性:

pd.read_csv(StringIO(tmp),header=None,parse_dates=date_spec,

date_parser=pd.io.date_converters.parse_date_time)

out:

nominalactual04

01999-01-27 19:00:001999-01-27 18:56:00KORD0.81

11999-01-27 20:00:001999-01-27 19:56:00KORD0.01

21999-01-27 21:00:001999-01-27 20:56:00KORD-0.59

31999-01-27 21:00:001999-01-27 21:18:00KORD-0.99

41999-01-27 22:00:001999-01-27 21:56:00KORD-0.59

51999-01-27 23:00:001999-01-27 22:56:00KORD-0.59

Parsing A Csv with Mixed Timezones

Pandas不能原生表示具有混合時區的列或索引。 如果CSV文件包含帶有時區混合的列,則默認結果將是帶有字符串的object-dtype列,即使包含parse_dates。

content = ('a\n'

'2000-01-01T00:00:00+05:00\n'

'2000-01-01T00:00:00+06:00\n')

pd.read_csv(StringIO(content),parse_dates=['a'])

out:

a

02000-01-01 00:00:00+05:00

12000-01-01 00:00:00+06:00

要將混合時區值解析為datetime列,請將部分應用的to_datetime()傳遞給utc = True作為date_parser。

pd.read_csv(StringIO(content),parse_dates=['a'],

date_parser=lambda col:pd.to_datetime(col,utc=True))

out:

a

01999-12-31 19:00:00+00:00

11999-12-31 18:00:00+00:00

?```

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python3兼容python2 print_python 字符串 r raw Python2 和 Python3 的區別及兼容技巧

前言最近 Python 之父 Guido van Rossum(龜爺)終于在 Python 官方郵件組落實了 Python 2.7 的終焉之日(EOL)。說的是 Python 2.7 的 EOL 日期最終確定為 2020 年 1 月 1 日,之后不會有任何更新,包括源碼的安全補丁。所以兼容Python3已經可以說非常必要了…

nginx搭建文件服務器腳本,基于docker搭建nginx文件服務器的方法步驟

1.在本機新建配置文件docker_nginx.confserver {listen 7070;server_name localhost;charset utf-8;location /files {#在docker內nginx的目錄alias /home/files;expires 1d;allow all;autoindex on;}2.啟動命令docker run --name nginx -d -p 7070:7070 -v D:\dev\nginx-1.13.…

python運行不了指令_python不是內部命令或外部命令,也不是可執行程序解決方法...

簡述 常見于新手初裝python,然后忘記勾選設置環境變量(PATH),或者沒有重啟,然后運行教程中的python命令時出現。 有兩個解決方法:1.設置環境變量,然后重啟。 2.新建命令。 如果你打算同時安裝多個python版本&#xff0…

快手通過標簽添加你什么意思_快快手粉絲數旁邊的關注是什么意思手通過關注頁添加是什么意思...

Aauto Speeter通過關注頁面添加的內容意味著,如果你已經在關注遇到了其他人,并且他們對你感興趣,他們將從這個關注頁面添加關注,并成為你的粉絲。事實上,得到關注和粉絲并不是特別困難。如果主要發表的內容有意思&…

ovation系統服務器安裝,Ovation系統介紹.ppt

Ovation系統介紹熱控調試關于OVATION系統的一點簡介;目錄;Ovation系統的結構及硬件;典型的OVATION系統結構;Primary;網線插拔后需重啟控制器,否則顯示橙色,failmode報警;每扇門都有風扇;;I/0 子系統結構 ; I/O 模件; I/O 卡指示 ;模件種類減少&#xff0…

東京戰紀服務器維護中,東京戰紀7月21維護公告 當前測試進度介紹

東京戰紀當前的測試進度已經有了很大的進步,接下來小編就跟大家一起看看測試期間對玩家給大家的報告吧。親愛的喰種和CCG搜查官們7月19日中午12:00,我們懷著緊張又忐忑的心情開啟了《東京戰紀》官網限量刪檔技術測試。大家對《東京喰種》IP的熱愛和對《東…

springboot能用python嗎_Python與springboot的對接

使用springboot建立一個web demo ,其中有一個接口如下,為了測試加了一個參數 type: Autowired private JdbcTemplate jdbcTemplate; RequestMapping(value "/getCountry", method RequestMethod.GET) // ResponseBody public List> getUser(RequestB…

docker重啟后容器消失_docker設置固定ip地址

代碼來源:博客園 原文作者:雪之谷 原文鏈接:https://www.cnblogs.com/xuezhigu/p/8257129.html 本文版權歸原作者所有,如有侵權請立即與我聯系,我將及時處理。 背景: 我開發用的機器上邊會啟動幾個容器,就因為保潔阿姨碰了一下我的插排,我的機器被斷電關機了。 默認情況下…

模型穩定后放在服務器上,把工程放在服務器上

把工程放在服務器上 內容精選換一換獲取方式:Ascend-mindx-msinstaller_{version}.zip:獲取鏈接適用場景:在一臺Linux服務器上使用msInstaller工具給本機安裝開發或運行環境。在一臺Linux服務器上使用msInstaller工具遠程給昇騰AI設備安裝開發…

洛陽地鐵一號線無人駕駛_洛陽地鐵洛陽造:智能化車廂、無人駕駛、加熱座椅……...

大家好,印象妹又來給大家播報地鐵的情況啦!自從12月1日地鐵1號線試運行啟動,后臺里經常有人私信印象妹,多講講咱大洛陽的地鐵情況,下面,來咯!身為洛陽人,我們都知道洛陽是中西部地區…

html計算器_學習HTML、CSS和JavaScript的最佳方法是什么?

與其他后端語言相比,HTML、CSS和JavaScript無論從閱讀角度還是編寫的角度來說都更加容易一點。所以新手在學習前端知識的時候不必有太大的心理壓力 ,心態擺正后,大部分人都可以將前端學好。下面聊聊Html、CSS、JavaScript的最佳學習方法&…

網站重新解析換服務器,更換解析服務器地址

更換解析服務器地址 內容精選換一換普通的域名解析只為用戶返回解析記錄,不會考慮訪問者的來源,這樣所有的訪問者都被解析到相同的IP地址上,容易出現由跨運營商訪問引起網絡延遲。運營商線路解析是云解析服務提供的按運營商維度來區分訪問者來…

git merge 回退_Git 基礎學習總結2(學不會你錘我)

作者序:我在知乎上搜索了有關 Git 的學習文章,雖然點贊很多但我認為他們寫得并不好,內容不夠詳盡,排版讓人看得疲勞,所以我決定自己寫幾篇關于 Git 的學習文章。當別人提供的不好用就自己創造一個新的,這也…

azure的虛擬機怎么選_Windows Azure案例: 選虛擬機或云服務

01虛擬機和云服務隨著云計算技術和市場的日漸成熟,企業在考慮IT管理和運維時的選擇也更加多樣化,應用也從傳統部署方式,發展為私有云、公有云、和混合云等部署方式。作為微軟核心的公有云平臺,Windows Azure提供了三種計算模式(虛…

ajax加載進度百分比,在ajax中顯示加載百分比的進度條,php

您好我正在使用ajax加載數據庫內容。我想顯示加載或圖像的總百分比。在ajax中顯示加載百分比的進度條,php這是我的腳本function name1(str){if (str.length0){document.getElementById("txtHint").innerHTML"";return;}if (window.XMLHttpReque…

python破解百度網盤提取碼_Python 一鍵獲取百度網盤提取碼

該 GIF 圖來自于官網,文末有給出鏈接。 描述 依托于百度網盤巨大的的云存儲空間,絕大數人會習慣性的將一些資料什么的存儲到上面,但是有的私密鏈接需要提取碼,但是讓每個想下載私密資源的人記住每一個提取碼顯然是不現實的。這個時…

assertpythonraise_使用assertRaise測試異常消息

我試圖在一個條件引發自定義異常消息的函數內斷言異常.功能:if not Cart.objects.filter(membermember).count():raise CartDoesNotExist("Cart Does Not Exist for Member: %s ( %id )." % (member.email,member.id))現在,我能夠成功地產生獲得加注聲明所…

vs12新建ajax,VS2012下WebService?的創建,部署和使用

WebService,即Web服務,能使得運行在不同機器上的不同應用無須借助,專門的第三方軟件或硬件,就可相互交換數據或集成.第一次選擇WebService,是為了替代數據庫遠程連接.我們都知道當SQL允許遠程時,則要打開某一端口.但這一點在我們已經部署好的服務器上,卻是不被允許的,于是就選擇…

pythonsql注入_python使用mysql,sql注入問題

python使用mysql importpymysql connpymysql.connect( host 127.0.0.1, #連接地址 port 3306, #端口 user root, #用戶名 password , #密碼 database db, #庫名稱 charset utf8 #編碼格式 utf8,不是utf-8 ) cursor conn.cursor(pymsql.cursors.DictCursor) #產生一個游標,…

h5優秀控件_H5前端學習的js插件大全,基本包含了大部分的前端最前沿的js插件和庫。...

布局SuperEmbed.js - 是一個Javascript庫,可檢測出網頁上的內嵌視頻并使他們能夠變成響應式元素。demoScrollReveal - ScrollReveal插件使用戶能夠無比輕松地創建桌面和移動瀏覽器的網頁滾動動畫。demoBricks.js - 是一款超快的用于固定寬度元素的“磚石”布局生成器…