Python 数据初步探索和数据预处理

1 数据展示与文件读写

1.1 数据展示

  • 读取.csv数据
import pandas as pd
df = pd.read_csv('loandata.csv')
df
数据读取.png
  • 展示部分数据:三种方式
df.head(n)  #展示前n个样本,n默认为5
df.tail(n) #展示末尾n个样本
df.sample() #从数据中随机采样n个样本

其他读取不同文件格式的接口


读取不同文件格式.png
  • 相关读写函数将数据化为DataFrame的一些技术:
  1. 不规整数据就处理:在读取数据文件时跳过一些行、页脚、注释等。
  2. 日期解析:组合功能,如将多个列的日期信息合并为一列。
  3. 索引:读取文件时,选择是否从文件中读取列名。
  4. 类型推断和数据转换:包括用户定义值的转换、缺失值等。
  5. 迭代:支持对大文件逐块迭代。
  • 参数设定
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()
  1. 使用同一个值填补
df.fillna(0)
  1. 使用前一个值(前向填补)或后一个值(后向填补),设置method。
df.fillna(method='ffill') # pad,前向填补
df.fillna(method='bfill') # backfill,后向填补
  1. 不同列不同值填补,输入字典
df.fillna({'one':0,'three':1})
  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数据分析基础》整理)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容