python:pandas之read_csv
导入必要的包
import pandas as pd
import numpy as np
from pandas.api.types import CategoricalDtype
from io import StringIO
dtype:
指定整个DataFrame的数据类型或用字典的方式指定各个列的数据类型
data = pd.read_csv('diamonds.csv',dtype=object)
data.head()out:
carat cut color clarity depth table price x y z
0 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
1 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
2 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
3 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
4 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75data.dtypesout:
carat object
cut object
color object
clarity object
depth object
table object
price object
x object
y object
z object
dtype: objectdata = 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
可以通过指定dtype ='category’或dtype = CategoricalDtype(类别,有序)直接解析类别列。
data = pd.read_csv('diamonds.csv',dtype='category')
data.dtypesout:
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.dtypesout:
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.dtypesout:
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:carat cut color clarity depth table price x y z
8 0.22 NaN E VS2 65.1 61.0 337 3.87 3.78 2.49
91 0.86 NaN E SI2 55.1 69.0 2757 6.45 6.33 3.52
97 0.96 NaN F SI2 66.3 62.0 2759 6.27 5.95 4.07
123 0.70 NaN F VS2 64.5 57.0 2762 5.57 5.53 3.58
124 0.70 NaN F VS2 65.3 55.0 2762 5.63 5.58 3.66
header:
文件可能包含标题行,也可能没有标题行。 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:a b c
0 1 2 3
1 4 5 6
2 7 8 9
通过指定name与header,可以重命名列以及是否丢弃标题行:
pd.read_csv(StringIO(data),names=['foo','bar','baz'],header=0)out:foo bar baz
0 1 2 3
1 4 5 6
2 7 8 9
通过指定name与header,可以重命名列以及是否丢弃标题行:
pd.read_csv(StringIO(data),names=['foo','bar','baz'],header=0)out:foo bar baz
0 1 2 3
1 4 5 6
2 7 8 9
pd.read_csv(StringIO(data),names=['foo','bar','baz'],header=None)out:foo bar baz
0 a b c
1 1 2 3
2 4 5 6
3 7 8 9
如果标题不在第一行中,则将行号传递给标题,将跳过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:a b c
0 1 2 3
1 4 5 6
2 7 8 9
Duplicate Names Parsing
usecols:
使用列名,位置号或可调用的方法选择文件中列的任何子集.
data = 'a,b,c,d\n1,2,3,foo\n4,5,6,bar\n7,8,9,baz'
pd.read_csv(StringIO(data))out:a b c d
0 1 2 3 foo
1 4 5 6 bar
2 7 8 9 baz
pd.read_csv(StringIO(data),usecols=['b','d'])out:b d
0 2 foo
1 5 bar
2 8 baz
pd.read_csv(StringIO(data),usecols=[0,1,3])out:a b d
0 1 2 foo
1 4 5 bar
2 7 8 baz
pd.read_csv(StringIO(data),usecols=lambda x: x.upper() in ['A','C'])out:a c
0 1 3
1 4 6
2 7 9
index_col:
data = ('a,b,c\n''4,apple,bat,5.7\n''8,orange,cow,10')
pd.read_csv(StringIO(data))out:a b c
4 apple bat 5.7
8 orange cow 10.0
pd.read_csv(StringIO(data),index_col=0)out:a b c
4 apple bat 5.7
8 orange cow 10.0
data = ('a,b,c\n''4,apple,bat\n''8,orange,cow')
pd.read_csv(StringIO(data))out:a b c
0 4 apple bat
1 8 orange cow
pd.read_csv(StringIO(data),index_col=0)out:b c
a
4 apple bat
8 orange cow
pd.read_csv(StringIO(data),usecols=['b','c'],index_col=0)out:c
b
apple bat
orange cow
parse_dates和date_parser:
为了更好地使用日期时间数据,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:A B C
date
2009-01-01 a 1 2
2009-01-02 b 3 4
2009-01-03 c 4 5
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_2 1_3 0 4
0 1999-01-27 19:00:00 1999-01-27 18:56:00 KORD 0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00 KORD 0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00 KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00 KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00 KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00 KORD -0.59
默认情况下,解析器会删除组件日期列,可以选择通过keep_date_col关键字保留它们:
pd.read_csv(StringIO(tmp),header=None,parse_dates=[[1,2],[1,3]],keep_date_col=True)out:1_2 1_3 0 1 2 3 4
0 1999-01-27 19:00:00 1999-01-27 18:56:00 KORD 19990127 19:00:00 18:56:00 0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00 KORD 19990127 20:00:00 19:56:00 0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00 KORD 19990127 21:00:00 20:56:00 -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00 KORD 19990127 21:00:00 21:18:00 -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00 KORD 19990127 22:00:00 21:56:00 -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00 KORD 19990127 23:00:00 22: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:nominal actual 0 4
0 1999-01-27 19:00:00 1999-01-27 18:56:00 KORD 0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00 KORD 0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00 KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00 KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00 KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00 KORD -0.59
重要的是要记住,如果要将多个文本列解析为单个日期列,则在数据前添加一个新列。
index_col参数基于这组新列而不是原始数据列:
pd.read_csv(StringIO(tmp),header=None,parse_dates=date_spec,index_col=0)out:actual 0 4
nominal
1999-01-27 19:00:00 1999-01-27 18:56:00 KORD 0.81
1999-01-27 20:00:00 1999-01-27 19:56:00 KORD 0.01
1999-01-27 21:00:00 1999-01-27 20:56:00 KORD -0.59
1999-01-27 21:00:00 1999-01-27 21:18:00 KORD -0.99
1999-01-27 22:00:00 1999-01-27 21:56:00 KORD -0.59
1999-01-27 23:00:00 1999-01-27 22:56:00 KORD -0.59
注意:如果列或索引包含不可解析的日期,则整个列或索引将作为对象数据类型原样返回。 对于非标准日期时间解析,请在pd.read_csv之后使用to_datetime()。
注意:read_csv具有用于解析iso8601格式的日期时间字符串的fast_path,例如“ 2000-01-01T00:01:02 + 00:00”和类似的变体。 如果可以安排数据以这种格式存储日期时间,则加载时间将明显缩短,约20倍。
最后,解析器允许您指定自定义date_parser函数,以充分利用日期解析API的灵活性:
pd.read_csv(StringIO(tmp),header=None,parse_dates=date_spec,date_parser=pd.io.date_converters.parse_date_time)out:nominal actual 0 4
0 1999-01-27 19:00:00 1999-01-27 18:56:00 KORD 0.81
1 1999-01-27 20:00:00 1999-01-27 19:56:00 KORD 0.01
2 1999-01-27 21:00:00 1999-01-27 20:56:00 KORD -0.59
3 1999-01-27 21:00:00 1999-01-27 21:18:00 KORD -0.99
4 1999-01-27 22:00:00 1999-01-27 21:56:00 KORD -0.59
5 1999-01-27 23:00:00 1999-01-27 22:56:00 KORD -0.59
skiprows
可以选择忽略前面的行数,通过下图可以对比使用skiprows前后的shape。
na_values
可以用来替换NA值
nrows
从文件开始时选取需要读取的行数。可以看到使用nrows=3之后,数据只有前三行。(df.head()默认读取前五行)
skipfooter
参考:
Python Pandas——Read_csv详解
【Python3】pandas.read_csv详解
python:pandas之read_csv相关推荐
- python pandas csv 追加 空行,python – Pandas:read_csv在空行后忽略行
有一个奇怪的.csv文件,如: header1,header2,header3 val11,val12,val13 val21,val22,val23 val31,val32,val33 很好,但在这 ...
- Python pandas用法
Python pandas用法 无味之味关注 12019.01.10 15:43:25字数 2,877阅读 91,914 介绍 在Python中,pandas是基于NumPy数组构建的,使数据预处理. ...
- python pandas 读写 csv 文件
python pandas 读写 csv 文件 具体看官方文档 https://www.pypandas.cn/docs/user_guide/io.html#csv-文本文件 import pand ...
- 独家 | 浅谈Python/Pandas中管道的用法
作者:Gregor Scheithauer博士 翻译:王闯(Chuck)校对:欧阳锦本文约2000字,建议阅读5分钟本文介绍了如何在Python/Pandas中运用管道的概念,以使代码更高效易读. 图 ...
- python pandas 把数据保存成csv文件,以及读取csv文件获取指定行、指定列数据
文章目录: 1 数据说明 2 把数据集文件信息使用python pandas保存成csv文件 3 使用python pandas 读取csv的每行.每列数据 1 数据说明 1.在test_data目录 ...
- pandas用read_csv时编码问题解决
在pandas用read_csv时,遇到编码错误的, 可带 encoding : str, default None Encoding to use for UTF when reading/writ ...
- csv 20位数据 如何打开可以预览完整数字_干货Python Pandas 做数据分析之玩转 Excel 报表分析...
本篇文章选自作者在 GitChat 的分享,若有什么问题,可在公众号回复「小助手」添加小助手微信,邀请你进入技术交流群. 各位朋友大家好,非常荣幸和大家聊一聊用 Python Pandas 处理 Ex ...
- 使用python pandas dataframe学习数据分析
⚠️ Note - This post is a part of Learning data analysis with python series. If you haven't read the ...
- python移动平均线绘图_对python pandas 画移动平均线的方法详解
数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.0 ...
最新文章
- GEO数据挖掘(1)引出
- 身份证号码有效性检测算法 ( js版 转 .net版 )
- 4. SQL Server数据库状态监控 - 作业状态
- nga能查服务器状态吗,NGAA
- linux安装mysql和使用c语言操作数据库的方法 c语言连接mysql
- win10电脑一开机提示拒绝访问怎么办
- bspline怎么使用 python_零基础5个月快速学会Python的秘诀
- 关于 FAT12 文件系统
- Android 外网远程连接真机进行开发调试
- 2020美团实习试题
- OpenCV像素点操作 图片特效
- C++ 工厂模式(Factory 模式)简介与实现
- PMP证书真的有用吗?
- 网站建设好但是访问不了的原因及解决方法
- 本地测试dubbo远程调用找不到provider
- linux_SIGCHLD信号-子进程回收
- 轻量级单元测试Cmockery源码学习 第一章
- Day9 :面向对象进阶
- Springboot 源码分析 —— @Endpoint 注解生效原理解析
- 城市公共数据治理初窥