目前最常用的数据保存格式可能就是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

​```

python csv pandas_Python Pandas——Read_csv详解相关推荐

  1. pandas.read_csv() 详解与如何合适的读取行序号与列名

    作为常用的函数,pandas.read_csv() 用于读取各种数据文件(.dat.txt.csv等),在这里做一个详细的解释. 灵活运用index_col与header准确的读取csv文件的行索引与 ...

  2. csv逗号分隔符转换_Pandas中处理Csv和Excel数据详解

    作者:Zarten知乎专栏:python数据分析与挖掘深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 概述 通 ...

  3. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  4. python画直方图成绩分析-python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage ...

  5. python ks值计算_利用Python计算KS的实例详解

    在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型.sOf免费资源网 一般来说.好人样本的分布同坏人样本的分布应该是有很 ...

  6. python画直方图-python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage ...

  7. 《 Python List列表全实例详解系列(四)》__列表删除元素(4种方法)删除重复元素(去重)(8种方法)

    <  Python List列表全实例详解系列(四)> __列表删除元素(4种方法)删除重复元素(去重)(8种方法) 我的技术成长&学习资料整理分享之路 我遇到问题查找资料时,经常 ...

  8. Pandas知识点-详解行列级批处理函数apply

    Pandas知识点-详解行列级批处理函数apply 在Pandas中,DataFrame和Series等对象需要执行批量处理操作时,可以借用apply()函数来实现. apply()的核心功能是实现& ...

  9. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

最新文章

  1. QGC注释消息提示框
  2. hadoop 计数器
  3. 研发团队平稳度过“从小到大”并非易事
  4. arduino 蓝牙示例_Arduino简单实例之八_蓝牙模块
  5. 数据结构—树(大纲)
  6. 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型
  7. 【跃迁之路】【507天】程序员高效学习方法论探索系列(实验阶段264-2018.06.27)...
  8. windows安装python3步骤_windows下python3第三方库安装方法总结
  9. Power of Two(Leetcode231)
  10. 复盘:windows ubuntu 双系统引导恢复、分区表恢复
  11. 分苹果(C语言实现)
  12. c语言令牌桶原理,基于多 goroutine 实现令牌桶
  13. IRedMail 邮箱配置
  14. SVN入门教程,超简单,30分钟学会!
  15. 「Deep Learning」Note on the Shattered Gradients Problem
  16. Contrastive Search Decoding——一种对比搜索解码文本生成算法
  17. matlab 程序文件,MATLAB程序文件
  18. 每个工程师都应该知道的 5 个射频发射器测量指标(自NI官网翻译)
  19. 所有的问题最终都会只剩下数学的问题
  20. debian VBoxManage 命令行安装 win2003

热门文章

  1. 汉字转html实体符号js_html实体编码遇上js代码
  2. vmware 蓝屏_网络安全小百科--利用微软CVE 2019-0708漏洞让对方系统蓝屏死机
  3. vb6 判断打印机是否有效_讲述3D打印机怎么用 初学者必看
  4. android mtk 按键,Android 4.0 虚拟按键、手机模式、平板模式(转)
  5. Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上
  6. BugkuCTF-MISC题Pokergame
  7. create用法java_Java AcousticEchoCanceler.create方法代碼示例
  8. 读保护_混合ASIL系统中不同安全等级模块间的边界保护
  9. 计算机控制用户自己编写什么软件吗,计算机控制软件技术基础.ppt
  10. java防止上传恶意文件_从补丁分析到在野利用:揭秘CVE20201464 Windows文件签名验证绕过漏洞疑云...