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.mzph.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 - 是一款超快的用于固定宽度元素的“砖石”布局生成器…