弄个盈利网站做什么,网站备案安全承诺书,免费网络电话免费30分钟,wordpress创建数据库错误目前最常用的数据保存格式可能就是CSV格式了#xff0c;数据分析第一步就是获取数据#xff0c;怎样读取数据至关重要。
本文将以pandas read_csv方法为例#xff0c;详细介绍read_csv数据读取方法。再数据读取时进行数据预处理#xff0c;这样不仅可以加快读取速度#x…目前最常用的数据保存格式可能就是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,dtypeobject)
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],errorscoerce)
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,dtypecategory)
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],orderedTrue)
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],orderedTrue)
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],header0)
out:
foobarbaz
0123
1456
2789
pd.read_csv(StringIO(data),names[foo,bar,baz],headerNone)
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),header1)
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),usecolslambda x: x.upper() in [A,C])
out:
ac
013
146
279
pd.read_csv(StringIO(data),usecolslambda 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_linesFalse)
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#,header1)
out:
ABC
0123
pd.read_csv(StringIO(data),comment#,skiprows2)
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#,skiprows4,header1)
out:
ABC
01.02.04.0
15.0NaN10.0
pd.read_csv(StringIO(data),skiprows4,header1)
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 # wouldnt 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_col0)
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_col0)
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_col0)
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_col0,parse_datesTrue)
out:
ABC
date
2009-01-01a12
2009-01-02b34
2009-01-03c45
pd.read_csv(StringIO(foo),index_col0,parse_datesTrue).index
DatetimeIndex([2009-01-01, 2009-01-02, 2009-01-03], dtypedatetime64[ns], namedate, freqNone)
通常我们可能希望分别存储日期和时间数据或分别存储各种日期字段。 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),headerNone,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),headerNone,parse_dates[[1,2],[1,3]],keep_date_colTrue)
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 [12]表示第二和第三列应分别解析为单独的日期列而parse_dates [[12]]意味着应将这两列解析为单个列。
还可以使用字典来指定自定义名称列
date_spec {nominal:[1,2],actual:[1,3]}
pd.read_csv(StringIO(tmp),headerNone,parse_datesdate_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),headerNone,parse_datesdate_spec,index_col0)
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-01T000102 0000”和类似的变体。 如果可以安排数据以这种格式存储日期时间则加载时间将明显缩短约20倍。
Date Parsing Functions
最后解析器允许您指定自定义date_parser函数以充分利用日期解析API的灵活性
pd.read_csv(StringIO(tmp),headerNone,parse_datesdate_spec,
date_parserpd.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:0005:00\n
2000-01-01T00:00:0006:00\n)
pd.read_csv(StringIO(content),parse_dates[a])
out:
a
02000-01-01 00:00:0005:00
12000-01-01 00:00:0006:00
要将混合时区值解析为datetime列请将部分应用的to_datetime传递给utc True作为date_parser。
pd.read_csv(StringIO(content),parse_dates[a],
date_parserlambda col:pd.to_datetime(col,utcTrue))
out:
a
01999-12-31 19:00:0000:00
11999-12-31 18:00:0000:00