第四章pandas数据的读取和显示
4.1数据读取
在日常生活中我们的数据常常被保存在数据库或者文本文件中,常用的文件格式有*.csv*、.txt和Excel表格。对于多种多样的数据来源和格式,pandas库提供了很多方便的读取API。本文接下来对上述三种文件格式的数据读取进行详解。
4.1.1CSV文件读取
4.1.1.1CSV格式简介
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。
例如,一个用户可能需要交换信息,从一个以私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据库程序可以导出数据为“CSV”,然后被导出的CSV文件可以被电子表格程序导入。
4.1.1.2读取CSV文件
现实世界的数据是繁多的,且通常是杂乱无章的。尽管有通用的CSV格式,但就如同MarkDown语法一样,各家都会在基础语法上添加属于自己独有的语法。这就导致用来处理CSV文件的方法read_csv()
有大量的参数,在pandas1.2.4版本中,该方法就有超过50个参数,所以本文只会专注于重要、常用的参数讲解,不会详解每一个参数。
方法1:read_csv()
。
read_csv(filepath_or_buffer,
sep=<object object>,
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, skipfooter=0,
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,
cache_dates=True, iterator=False, chunksize=None,
compression='infer', thousands=None, decimal='.',
lineterminator=None, quotechar='"', quoting=0, doublequote=True,
escapechar=None, comment=None, encoding=None, dialect=None,
error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False,
low_memory=True, memory_map=False, float_precision=None,
storage_options=None)
参数说明:
重要参数1:filepath_or_buffer:指定数据路径
重要参数2:sep:指定分割符,默认是逗号,C引擎不能自动检测分隔符,但Python解析引擎可以
重要参数3:delimiter:同sep参数,指定分隔符
重要参数4:header:指定第几行作为列名,如果没有指定列名,默认header=0
重要参数5:names:指定列名,如果文件中不包含header的行,应该显性表示header=None
重要参数6:index_col:指定用作的行标签的列,默认None,即线性标签
重要参数7:usecols :指定使用的列的名称或者序号,最后结果会返回列的子集,默认None
重要参数8:squeeze:布尔型,指定在只有一列的情况下返回Series实例,默认为False
重要参数9:prefix:字符型,指定在没有标题时添加到列号的前缀,默认为none
重要参数10:mangle_dupe_cols:指定当遇到重复列时重复的列将被指定为“ X”,“ X.1”,……“ X.N”,默认为True
重要参数11:dtype:指定数据或列的数据类型,例如{‘a’:np.float64,‘b’:np.int32,‘c’:‘Int64’}指定abc散列不同的数据类型
重要参数12:engine:指定选择读取的引擎,可选{‘c’, ‘python’},两者的一些性能是不同的
C:指定使用C引擎
pyhton:指定使用python引擎
重要参数13:skipinitialspace:布尔型,指定忽略分隔符后的空格,默认false
重要参数14:skiprows:指定在文件开始处要跳过的行号或要跳过的行数
重要参数15:skip_footer:指定要跳过的文件底部的行数
重要参数16:nrows:整数型,指定读取的行数
重要参数17:na_filter:布尔型,指定是否打开缺失值过滤器,默认为True
重要参数18:skip_blank_lines:指定是否跳过空白行且不解释为NA,默认为True,跳过blank lines 而且不是定义为NAN
重要参数19:thousands:指定千分位符号,默认“,”
重要参数20:decimal:指定识别为小数点的字符
重要参数21:encoding::指定读写时的编码方式
重要参数22:na_values:指定被视为缺失值NA或者NaN的值
重要参数22:error_bad_lines:布尔型,制定是否删除具有太多字段的行,即逗号太多的行,默认True
重要参数23:warn_bad_lines:布尔型,指定在error_bad_lines=False的情况下给出每一个多字段行的警告
重要参数24:true_values:指定被视为True的值
重要参数25:false_values:指定被视为False的值
正确示例1:读取CSV文件,不传递任何参数,行索引为线性索引,第一行作为表头。
#读取CSV文件,不传递任何参数,行索引为线性索引,第一行作为表头。
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014 .csv')
df.head()
正确示例1结果:
正确示例2:传递col_index=0
,将Date列作为行索引,第一行作为表头,接下来的程序默认传递col_index=0
,对此不会再进行说明。
#读取CSV文件,传递indexcol=0,将Date列作为行索引
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014 .csv', index_col=0)
df.head()
正确示例2结果:
正确示例3:传递header=1
,将第二行作为列标签。
#读取CSV文件,传递`header=1`,将第二行作为列标签。
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, header=1)
df.head()
正确示例3结果:
正确示例4:传递header=0
和names=list('abcdefg')
,指定列标签为abcdefg。
#传header=0`和names=list('abcdefg'),指定列标签为abcdefg。
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, header=0, names=list('abcdefg'))
df.head()
正确示例4结果:
正确示例5:传递prefix=X.
,同时传递header=None
指定列标签前缀为’X.’。
#传递prefix=X.,指定列标签前缀
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, prefix='X.', header=None)
df.head()
正确示例5结果:
错误示例1:指定列标签前缀,但是header!=None
,会引发ValueError。
#传递prefix=X.错误示例,指定列标签前缀,但是header!=None,会引发ValueError: Argument prefix must be None if argument header is not None
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, prefix='X.')
df.head()
错误示例1结果:
正确示例6:传递usecols=[0, 1, 2]
获取只包含前三列的子集。
#传递usecols=[0, 1, 2]获取只包含前三列的子集
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, usecols=[0, 1, 2])
df.head()
正确示例6结果:
正确示例6对比示例:传递usecols=[0, 1, 2]
,不传递index_col=0
,发现date列成为了子集的一部分,这引发了一个问题是先取子集再设置索引还是先设置索引再取子集,所以我们做了第二个对比试验。
#传递usecols=[0, 1, 2]对比示例,不传递index_col=0
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', usecols=[0, 1, 2])
df.head()
正确示例6对比示例结果:
正确示例6对比示例2:不传递index_col=0
,传递usecols=[2, 3, 4]
,从下图我们可以得出结论是先进行子集的切割在进行轴索引的设置。
#对比示例2,不传递index_col=0,传递usecols=[2, 3, 4]
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', usecols=[2, 3, 4], index_col=0)
df.head()
正确示例6对比示例2结果:
正确示例7:传递skiprows=lambda x: x % 2 != 0
,跳过所有奇数行。
#传递skiprows=lambda x: x % 2 != 0,跳过所有奇数行
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, skiprows=lambda x: x % 2 != 0)
df.head()
正确示例7结果:
正确示例8:传递nrows=2
,只读取前两行数据。
#传递nrows=2只读取两行
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, nrows=2)
df.head()
正确示例8结果:
正确示例9:传递dtype=dict()
指定第一列数据是字符型,第二列数据是浮点型,第三列数据是整数型。
#传递dtype参数指定第一列数据是字符型,第二列数据是浮点型,第三列数据是整数型
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, dtype={'Temperature(Celsius)(high)': np.str, 'Temperature(Celsius)(avg)': np.float32, 'Temperature(Celsius)(low)': np.int32})
df.head()
正确示例9结果:
正确示例10:传递na_values=12,将数值12定义为额外缺失值。
#传递na_values=12,将数值12定义为额外缺失值
df = pd.read_csv('E:\postgraduate\document\csv数据集\Beijing2014test.csv', index_col=0, na_values=12)
df.head()
正确示例10结果:
4.1.2 Excel文件的读取
Microsoft Excel是电子试算表程序,他的最大特点就是表,一张表是一组数据,每个数据存放在一个cell里头。这样做的好处就是我们没必要纠结于分隔符的选择,仅仅以位置信息就可以所引出想要的数据。通常我们使用xlrd和xlwt两个第三方库进行读写,此外像Numpy或者pandas这样的数据统计库都会有自己的读取API。
4.1.2.1读取Excel文件
方法1:read_excel()
方法。
read_excel(io, sheet_name=0, header=0, names=None,
index_col=None, usecols=None, squeeze=False,
dtype=None, engine=None, converters=None, true_values=None,
false_values=None, skiprows=None, nrows=None, na_values=None,
keep_default_na=True, na_filter=True, verbose=False,
parse_dates=False, date_parser=None, thousands=None,
comment=None, skipfooter=0, convert_float=True,
mangle_dupe_cols=True, storage_options=None)
参数说明:
参数1:io:指定文件路径
参数2:sheet_name:指定要读取的工作表名称或索引号,默认0
参数3:header:整数型,指定用于列标签的行,默认0
参数4:names:指定header=None时列标签的名称,默认None
参数5:index_col:指定用作的行标签的列,默认None,即线性标签
参数6:usecols :指定使用的列的名称或者序号,最后结果会返回列的子集,默认None
参数7:squeeze:布尔型,指定在只有一列的情况下返回Series实例,默认为False
参数8:dtype:指定数据或列的数据类型,例如{‘a’:np.float64,‘b’:np.int32,‘c’:‘Int64’}指定abc散列不同的数据类型
参数9:engine:指定选择读取的引擎,可选{‘c’, ‘python’},两者的一些性能是不同的
C:指定使用C引擎
pyhton:指定使用python引擎
参数10:true_values:指定被视为True的值
参数11:false_values:指定被视为False的值
参数12:skiprows:指定在文件开始处要跳过的行号或要跳过的行数
参数13:nrows:整数型,指定读取的行数
参数14:na_values:指定被视为缺失值NA或者NaN的值
参数15:na_filter:布尔型,指定是否打开缺失值过滤器,默认为True
参数16:verbose:布尔型,指示放置在非数字列中的NA值的数量
参数17:thousands:指定千分位符号,默认“,”
参数18:skipfooter:指定要跳过的文件底部的行数
参数19:convert_float:布尔型,指定是否将浮点数变换为整数
参数20:mangle_dupe_cols:指定当遇到重复列时重复的列将被指定为“ X”,“ X.1”,……“ X.N”,默认为True
ps1:read_excel和read_csv两者的参数很接近,在此就不给出示例了,需要注意的就是sheet_name参数可以进行任意页读取。
4.2数据展示
4.2.1查看部分数据
方法1:head(nrow)
方法。
正确示例1:传递nrow=3
查看前三行数据。
#展示部分数据方法1:使用head(nrows)方法,出来的nrows=3查看前三行
df.head(3)
正确示例1结果:
正确示例2:不传递任何参数默认查看前5行。
df.head()
正确示例2结果:
方法2:使用各种切片方法。
正确示例1:切片详见数据分析学习(二),这里只是单纯给出示例。
#展示部分数据方法2:使用各种切片方法
df.iloc[:4]
正确示例1结果:
ps1:head方法的底层就是return self.iloc[:n]
使用了iloc方法,本质上来说head就是一个iloc的包装方法。
4.2.2查看数据统计信息
方法1:describe()
方法。
正确示例1:使用describe方法查看最大值、最小值、4分位数、均值、标准差和数量。
#使用describe方法查看最大值、最小值、4分位数、均值、标准差和数量
df.describe()
正确示例1结果:
方法2:将describe方法拆开进行使用。
正确示例1:使用.mean()
方法查看每一列平均数。
#使用.mean()方法查看每一列平均数。
df.mean()
正确示例1结果:
ps1:describe方法是一种整合方法,他的本质是d = ([data.count() + data.mean(), data.min()] + data.quantile(percentiles).tolist() + [data.max()])
这句话,是多个函数的叠加产物,所以如果不想使用describe方法的话,拆开使用也是没问题的。
4.2.3查看数据属性
4.2.3.1查看数据个数
方法1:.size
属性。
正确示例1:查看DataFrame的size属性获得该实例的元素个数。
#查看DataFrame的size属性获得该实例的元素个数
df.size
正确示例1结果:
方法2:.count()
方法。
正确示例1:使用count方法查看每一列的元素数量统计。
#使用count方法查看每一列元素数量
df.count()
正确示例1结果:
正确示例1对比示例:DataFrame中的缺失值是不统计在内的,修改部分数据为缺失值NaN,则统计结果会发生改变。
#修改部分数据为缺失值NaN
df.iloc[:-5] = np.NaN
df.count()
对比示例结果:
ps1:count方法不会统计缺失值,但是size属性会统计缺失值。
4.2.3.2查看数据各个属性
4.2.3.2.1查看数据形状
方法1:.shape
属性。
正确示例1:使用DataFrame示例的shape属性查看数据长宽。
#使用DataFrame示例的shape属性查看数据长
df.shape
正确示例1结果:
4.2.3.2.2产看数据两个维度轴
方法1:.axes
属性。
正确示例1:使用axes属性查看DataFrame两个轴,或者说两个维度信息,列表第一个值是行索引列表,第二个值是列标签列表。
#使用axes属性查看DataFrame两个轴,或者说两个维度
df.axes
正确示例1结果:
方法2:.index
属性。
正确示例1:使用index属性查看DataFrame行索引,返回值不是列表实例,而是pandas独有的Index实例。
#使用index属性查看DataFrame行索引
df.index
正确示例1结果:
方法3:.columns
属性。
正确示例1:使用columns属性查看DataFrame列标签,返回值不是列表实例,同样是pandas独有的Index实例。
#使用columns属性查看DataFrame列标签
df.columns
正确示例1结果:
4.2.3.2.3查看数据维数
方法1:.ndim
属性。
正确示例1:使用ndim属性查看DataFrame维数,实质上这是个固定值,DataFrame实例返回2,Series实例返回1。
#查看DataFrame维数
df.ndim
正确示例1结果:
4.2.3.2.4查看数据元素类型
方法1:.dtypes
属性。
正确示例1:使用dtypes属性查看每列元素类型,假设一列中是混合类型可能会返回object类型。
#使用dtypes属性产看每列元素类型
df.dtypes
正确示例1结果: