1 数据展示与文件读写
1.1 数据展示
- 读取.csv数据
import pandas as pd
df = pd.read_csv('loandata.csv')
df
- 展示部分数据:三种方式
df.head(n) #展示前n个样本,n默认为5
df.tail(n) #展示末尾n个样本
df.sample() #从数据中随机采样n个样本
其他读取不同文件格式的接口
- 相关读写函数将数据化为DataFrame的一些技术:
- 不规整数据就处理:在读取数据文件时跳过一些行、页脚、注释等。
- 日期解析:组合功能,如将多个列的日期信息合并为一列。
- 索引:读取文件时,选择是否从文件中读取列名。
- 类型推断和数据转换:包括用户定义值的转换、缺失值等。
- 迭代:支持对大文件逐块迭代。
- 参数设定
fixed_df = pd.read_csv('loandata_chi.csv', sep=';', encoding='gbk’,
parse_dates=['...'], index_col='...')
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL类型包括:http, ftp, s3和文件。对于多文件正在准备中
sep : str, default ‘,’
指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:'\r\t'
delimiter : str, default None
定界符,备选分隔符(如果指定该参数,则sep参数失效)
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep='\s+'。如果这个参数设定为Ture那么delimiter 参数失效。
header : int or list of ints, default ‘infer’
指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始。)。
注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一行数据而不是文件的第一行。
names: array-like, default None
用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。
index_col : int or sequence or False, default None
用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
如果文件不规则,行尾有分隔符,则可以设定index_col=False 来是的pandas不适用第一列作为行索引。
usecols : array-like, default None
返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。
as_recarray : boolean, default False
不赞成使用:该参数会在未来版本移除。请使用pd.read_csv(...).to_records()替代。
返回一个Numpy的recarray来替代DataFrame。如果该参数设定为True。将会优先squeeze参数使用。并且行索引将不再可用,索引列也将被忽略。
squeeze: boolean, default False
如果文件值包含一列,则返回一个Series
prefix: str, default None
在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, ...
mangle_dupe_cols: boolean, default True
重复的列,将‘X’...’X’表示为‘X.0’...’X.N’。如果设定为false则会将所有重名列覆盖。
dtype : Type name or dict of column -> type, default None
每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}
engine: {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。
converters : dict, default None
列转换函数的字典。key可以是列名或者列的序号。
true_values : list, default None
Values to consider as True
false_values : list, default None
Values to consider as False
skipinitialspace: boolean, default False
忽略分隔符后的空白(默认为False,即不忽略).
skiprows : list-like or integer, default None
需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
skipfooter : int, default 0
从文件尾部开始忽略。 (c引擎不支持)
skip_footer : int, default 0
不推荐使用:建议使用skipfooter ,功能一样。
nrows : int, default None
需要读取的行数(从文件头开始算起)。
na_values : scalar, str, list-like, or dict, default None
一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
keep_default_na: bool, default True
如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。
na_filter: boolean, default True
是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。
verbose : boolean, default False
是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。
skip_blank_lines : boolean, default True
如果为True,则跳过空行;否则记为NaN。
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 对象,以便逐块处理文件。
chunksize : int, default None (用于分块读取)
文件块的大小, See IO Tools docs for more informationon iterator and chunksize.
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中必须只包含一个文件。设置为None则不解压。
新版本0.18.1版本支持zip和xz解压
thousands : str, default None
千分位分割符,如“,”或者“."
decimal : str, default ‘.’
字符中的小数点 (例如:欧洲数据使用’,‘).
float_precision : string, default None
Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
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的时候,使用双引号表示引号内的元素作为一个元素使用。
escapechar : str (length 1), default None
当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。
comment : str, default None
标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c'作为header。
encoding : str, default None
指定字符集类型,通常指定为'utf-8'. List of Python standard encodings
dialect : str or csv.Dialect instance, default None
如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档
tupleize_cols : boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
error_bad_lines : boolean, default True
如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。
warn_bad_lines : boolean, default True
如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。
low_memory: boolean, default True
分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)
如果整数列被压缩(i.e. compact_ints=True),指定被压缩的列是有符号还是无符号的。
memory_map : boolean, default False
如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。
- 读取任一大小的块
df = pd.read_csv('loandata.csv', iterator=True)
df.get_chunk(4)
1.2 文件读写
读取loandata.csv文件,将得到的数据存为loandata3.csv
df = pd.read_csv('loandata.csv', nrows=3)
df.to_csv('loandata_3.csv’)
输出时可以使用sys.stdout把最终存在文件中的内容打印出来输出在屏幕上。
import sys
df.to_csv(sys.stdout)
此时的输出结果会将位置也存入文件,这除非在索引列示自定义的情况下都是不必要的
- 制定grade为索引列
df = pd.read_csv('loandata.csv', nrows=3, index_col='grade')
df.to_csv(sys.stdout)
- 一般情况,设置index=False
df = pd.read_csv('loandata.csv', nrows=3)
df.to_csv(sys.stdout, index=False)
- Excel文件读写
Excel文件一般使用制表符分隔列,可能存在多个工作表(sheet)。
分别使用read_excel()和to_excel()读写,但注意需要设置sheetname。 - 把loandata数据存在一个Excel文件的不同sheet中
import pandas as pd
pd.set_option('display.max_rows', 4)
pd.read_excel('loandata.xls', sheet_name='first')
- 如果sheet_name包含多个sheet,读取操作将返回一个有序词典OrderedDict,每个sheet的数据可以通过字典索引方式得到。
df = pd.read_excel('loandata.xls’,
sheet_name=['first', 'second'])
df['second']
2 数据类型和数据筛选
2.1 数据类型
Pandas对象数据类型=Python数据类型+Numpy数据类型:
float,int,bool,datetime64[ns],datetime64[ns,tz],timedelta[ns],category,object
- 数值型数据类型:类型名,加上一个表示元素位长的数字。
-当Series只有字符串或有多个数据类型时,dtype是object类型。 - DF的dtypes属性,可以得到各个特征的数据类型。
sample.dtypes
- astype()转换数据类型
sample['G'] = sample['G'].astype('int32')
sample = sample.astype({'B':'int8', 'G':'int32'}) # 对多列进行转换,采用字典-列名:目标数据类型
2.2 数据筛选
- select_dtypes()筛选特定数据类型的特征。
- 两个参数:exclude:剔除的;include:选取的
select_dtypes(include=None, exclude=None) # 如果有,就输入一个list
3 描述性汇总统计
3.1 描述性统计
参数axis,默认axis=0对索引index进行操作(即操作后左边那一列变化),axis=1表示对列columns进行操作(即操作后上面那一行变化)。
df = pd.read_csv('loandata.csv')
df.mean(0) # 可以省略为df.mean()
df.mean(1)[:5] #计算前5个样本的所有数值型特征的均值
- 验证
df_number = df.select_dtypes(include='number')
df_number.head(1)
df0 = df_number.iloc[0]
df0.mean()
-
使用df.count()查看非缺失值样本的数量
3.2 汇总统计
- describe()方法查看均值、标准差、最大值、最小值、分位数。也可以对非数值型进行统计,但指标有所不同。默认只对数值型。可以使用include和exclude方法。可以传入'all'表示所有。
- percentiles参数显示哪几个分位数
df.describe(percentiles=[.05, .5, .95])
- info()显示各列数据类型、非空值数量、总体样本数和所占内存。
- cov()和corr()表示协方差和相关系数。
4 算术运算
- Pandas对象进行加减乘除二元运算时,根据索引自动对齐数据,存在不同索引对时取并集。不重叠的索引处引入缺失值并且在运算过程中自动传播。
- +-*/可以用add()、sub()、mul()、div()代替。是对应元素相乘而不是矩阵乘法。
- DataFrame和Series运算时,存在广播行为,可理解为一种匹配行为
- 算术运算默认axis=1.
5 缺失值处理
- 通常用NA(Not available)代指,在Pandas数据结构用NaN(Not a Number)。可以用isnull()分析。
- True和 False在进行算术运算时视为1和0.
- 缺失值填补fillna()
- 使用同一个值填补
df.fillna(0)
- 使用前一个值(前向填补)或后一个值(后向填补),设置method。
df.fillna(method='ffill') # pad,前向填补
df.fillna(method='bfill') # backfill,后向填补
- 不同列不同值填补,输入字典
df.fillna({'one':0,'three':1})
- 使用一个Pandas对象进行填补
df.fillna(df.mean())
6 索引调整方法
- 更改index(左边那列)
df.index = [ 'a' , 'b' , 'c' ]
- reindex() :重新索引并得到一个新的Pandas对象。不仅重新索引DataFrame,同时也实现过滤功能。
df.reindex(['b', 'c', 'e'])
df.reindex(columns=['two', 'three', 'four'])
- 如果使用某一列作为索引,使用set_index()
df.set_index('two')
- 修改索引或列名,使用rename()
df.rename({'a':'A', 'b':'B', 'c':'C'})
df.rename(columns=str.upper)
df.rename(columns=lambda x:x[:2].upper()+x[2:].lower())
7 层次化索引
- 使用列表创建有多级别索引的Series
data = pd.Series(np.random.randn(5),index=[['a', 'a', 'b', 'b', 'b'],['a1', 'a2', 'b1', 'b2', 'b3']])
data.index
# MultiIndex(levels=[['a', 'b'], ['a1', 'a2', 'b1', 'b2', 'b3']],labels=[[0, 0, 1, 1, 1], [0, 1, 2, 3, 4]])
- 索引是MultiIndex对象,levels包含每个级别索引的标签,labels每个数据在不同leels的位置标记。对每个数据而言,索引是个元组。
tuples = [('a', 'a1'), ('a', 'a2'), ('b', 'b1'), ('b', 'b2'), ('b', 'b3')]
pd.Series(np.random.randn(5), index=tuples)
- 创建一个层次化索引:
pd.MultiIndex.from_arrays(arrays)
pd.MultiIndex.from_tuples(tuples)
pd.MultiIndex.from_product(iterable)
arrays = np.array([['a', 'a', 'a', 'b', 'b', 'b'], ['x', 'y', 'z', 'x', 'y', 'z']])
tuples = [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'x'), ('b', 'y'), ('b', 'z')]
iterable = [['a', 'b'], ['x', 'y', 'z']]
#MultiIndex(levels=[['a', 'b'], ['x', 'y', 'z']],labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
index = pd.MultiIndex.from_product(iterable)
data = pd.Series(np.random.randn(6), index=index)
data.index.names = ['first', 'second']
data.index
#MultiIndex(levels=[['a', 'b'], ['x', 'y', 'z']],labels=[[0, 0, 0, 1, 1, 1],[0, 1, 2, 0, 1, 2]],names=['first', 'second'])
- DF
- 重排级别顺序
df.swaplevel(0,1,axis=1)
df.reorder_levels([1,0],axis=1)
- 提取部分数据:使用.loc()和.iloc(),首先通过.loc(axis)制定对行索引还是对列索引
df.loc(axis=0)[:,'x']
- 对任意级别,用xs()方法
df.xs('x',level=1,axis=0)
- stack()和unstack()
stack():上到左,unstack():左到上 - reset_index()重置层级索引,提取index级别level放入columns级别col_level
df.reset_index(level=1,col_level=1)
(根据《Python数据分析基础》整理)