1 本文适合读者
刚开始学习Pandas的新手
2 环境
Python 3.7.0
Pandas 0.23.4
NumPy 1.15.2
import numpy as np
import pandas as pd
3 测试文件
这是一个常见的水果销量表,每个月每种水果的单价、数量、和销售金额 用逗号分隔开的内容粘贴到文本文件 a.csv: 月份,水果,数量,单价,金额 201801,苹果,65,2.3,149.50 201802,苹果,101,2.3,232.30 201803,苹果,113,2.5,282.50 201804,苹果,145,2.5,362.50 201805,苹果,145,2.5,362.50 201806,苹果,167,2.8,467.60 201807,苹果,203,2.8,568.40 201808,苹果,255,2.9,739.50 201801,香蕉,180,3.5,630.00 201802,香蕉,201,3.5,703.50 201803,香蕉,223,3.5,780.50 201804,香蕉,254,3.9,990.60 201805,香蕉,267,3.9,1041.30 201806,香蕉,213,4.4,937.20 201807,香蕉,280,4.4,1232.00 201808,香蕉,310,4.4,1364.00 201801,西瓜,400,3.8,1520.00 201802,西瓜,450,3.8,1710.00 201803,西瓜,481,3.5,1683.50 201804,西瓜,495,3.5,1732.50 201805,西瓜,580,3.2,1856.00 201806,西瓜,610,3.2,1952.00 201807,西瓜,688,2.5,1720.00 201808,西瓜,753,1.8,1355.40
4 read_csv方法和主要参数
df = pd.read_csv(filepath/filename,sep=',',delimiter=None,header='infer',names=None)
4.1 不加任何参数
df = pd.read_csv('a.csv')
文件名用单引号扩起来,pandas能正常解析csv文件,
文件第一行的列名会自动成为df对象的列名。
df.columns
Index(['月份', '水果', '数量', '单价', '金额'], dtype='object')
4.2 指定csv文件的分隔符
df = pd.read_csv('a.csv',sep=',')
用sep来指定csv文件的分隔符,sep的默认值是“,”,
一般csv文件的分隔符都是“,”,因此这里可以省略,pandas解析的结果同4.1。
如果csv文件用制表符Tab分隔,那么这里必须指定sep='\t'。
delimiter参数是sep参数的另一种写法,两个只要写一个就可以了。
4.3 指定列名
标题行参数header,默认值是'infer',也就是在没有指定列名时,相当于 header=0 且列名用第一行的内容作为各列的列名;
# header=0默认可以省略,表示用第一行作列名
df = pd.read_csv('a.csv',header=0)
# header=1表示用第二行作列名
df = pd.read_csv('a.csv',header=1)
# 结果列名变成 Index(['201801', '苹果', '65', '2.3', '149.50'], dtype='object')
如果要指定列名,则需要将 header=None ,然后用names参数传入列名。
当 header=None ,但不传入列名时,pandas自动用数字序列作列名:
df = pd.read_csv('a.csv',header=None)
结果是列名变成[0, 1, 2, 3, 4],csv文件的第一行被作为数据看待
0 1 2 3 4
0 月份 水果 数量 单价 金额
1 201801 苹果 65 2.3 149.50
2 201802 苹果 101 2.3 232.30
3 201803 苹果 113 2.5 282.50
通过names参数可以指定列名,names是一个列表:
df = pd.read_csv('a.csv',header=None,names=['month','fruit','count','price','amount'])
结果可以看到列名从0,1,2,3,4变成了指定的列名:
month fruit count price amount
0 月份 水果 数量 单价 金额
1 201801 苹果 65 2.3 149.50
2 201802 苹果 101 2.3 232.30
3 201803 苹果 113 2.5 282.50
也就是说,当原始csv文件的第一行不是列名时,可以通过 header=None, names=list 来传入指定的列名。
这里,原始csv文件的第一行被作为数据很讨厌,可以通过 header=0 来达到替换列名的效果:
df = pd.read_csv('a.csv',header=0,names=['month','fruit','count','price','amount'])
结果可以看到csv文件的第一行被替换成了新的列名:
month fruit count price amount
0 201801 苹果 65 2.3 149.5
1 201802 苹果 101 2.3 232.3
2 201803 苹果 113 2.5 282.5
3 201804 苹果 145 2.5 362.5
5 其他参数解释
.read_csv(filepath_or_buffer, sep=’, ‘, delimiter=None, header=’infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression=’infer’, thousands=None, decimal=b’.’, lineterminator=None, quotechar=’”’, quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=None, compact_ints=None, use_unsigned=None, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)
filepath_or_buffer : 路径 URL 可以是http, ftp, s3, 和 file.
sep: 指定分割符,默认是’,’C引擎不能自动检测分隔符,但Python解析引擎可以
delimiter: 同sep
delimiter_whitespace: True or False 默认False, 用空格作为分隔符等价于spe=’\s+’如果该参数被调用,则delimite不会起作用
header: 指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None
names 指定列名,如果文件中不包含header的行,应该显性表示header=None
index_col: 默认为None 用列名作为DataFrame的行标签,如果给出序列,则使用MultiIndex。如果读取某文件,该文件每行末尾都有带分隔符,考虑使用index_col=False使panadas不用第一列作为行的名称。
usecols: 默认None 可以使用列序列也可以使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’]
as_recarray:默认False , 将读入的数据按照numpy array的方式存储,0.19.0版本后使用
pd.read_csv(…).to_records()。 注意,这种方式读入的na数据不是显示na,而是给以个莫名奇妙的值
squeeze: 默认为False, True的情况下返回的类型为Series
prefix:默认为none, 当header =None 或者没有header的时候有效,例如’x’ 列名效果 X0, X1, …
mangle_dupe_cols :默认为True,重复的列将被指定为’X.0’…’X.N’,而不是’X’…’X’。如果传入False,当列中存在重复名称,则会导致数据被覆盖。
dtype: E.g. {‘a’: np.float64, ‘b’: np.int32} 指定数据类型
engine: {‘c’, ‘python’}, optional 选择读取的引擎目前来说C更快,但是Python的引擎有更多选择的操作
skipinitialspace: 忽略分隔符后的空格,默认false,
skiprows: list-like or integer or callable, default None 忽略某几行或者从开始算起的几行
skipfooter: 从底端算起的几行,不支持C引擎
nrows: int 读取的行数
na_values: 默认None NaN包含哪些情况,默认情况下, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表现为NAN
keep_default_na: 如果na_values被定义,keep_default_na为False那么默认的NAN会被改写。 默认为True
na_filter: 默认为True, 针对没有NA的文件,使用na_filter=false能够提高读取效率
skip_blank_lines 默认为True,跳过blank lines 而且不是定义为NAN
thousands 千分位符号,默认‘,’
decimal 小数点符号,默认‘.’
encoding: 编码方式
memory_map如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存上,并直接从那里访问数据。使用此选项可以提高性能,因为不再有任何I / O开销。
low_memory 默认为True 在块内部处理文件,导致分析时内存使用量降低,但可能数据类型混乱。要确保没有混合类型设置为False,或者使用dtype参数指定类型。请注意,不管怎样,整个文件都读入单个DataFrame中,请使用chunksize或iterator参数以块形式返回数据。 (仅在C语法分析器中有效)
parse_dates : boolean or list of ints or names or list of lists or dict, default False
boolean. True -> 解析索引
list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作为独立的日期列;
list of lists. e.g. If [[1, 3]] -> 合并1,3列作为一个日期列使用
dict, e.g. {‘foo’ : [1, 3]} -> 将1,3列合并,并给合并后的列起名为"foo"
infer_datetime_format : boolean, default False
如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。
keep_date_col : boolean, default False
如果连接多列解析日期,则保持参与连接的列。默认为False。
date_parser : function, default None
用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。
1.使用一个或者多个arrays(由parse_dates指定)作为参数;
2.连接指定多列字符串作为一个列作为参数;
3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。
dayfirst : boolean, default False
DD/MM格式的日期类型
iterator : boolean, default False
返回一个TextFileReader 对象,以便逐块处理文件。
lineterminator : str (length 1), default None
行分割符,只在C解析器下使用。
quotechar : str (length 1), optional
引号,用作标识开始和解释的字符,引号内的分割符将被忽略。
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True
双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用
low_memory : boolean, default True
分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)
5 导入时间字段
数据字段的格式如下:
inDate
2017-01-18 00:00:01
导入方法:
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m-%d %H:%M:%S')
df = pd.read_csv("a.csv",parse_dates=[0],date_parser=dateparse)
parse_dates:这是指定含有时间数据的列,用一个列表或者字典来指定要解析的列。
Pandas笔记系列
Pandas笔记2-导出csv文件