论pandas大数据分析经常出现的一些问题(新手向)

1.文件头

#coding=utf-8

因为要处理中文信息,所以需要在代码文件最顶端加上这一行。python版本为3.*的可不加。

2.pandas的数据类型

pandas中的数据类型对象分为2种,一种为series,另一种为dataframe。

简单点说,你可以将series看成一个一维数组,index为它的行名,colums为它的列名,colums只有一个。

dataframe则为一个二维数组,index为它的行名,colums为它的列名(有多个)。

3.数据读取

pandas中常用的读取本地文件的一个函数即为read_csv(),返回dataframe,内置常用参数有

filepath:文件路径,接收类型为string;
sep:以什么符号间隔,默认为',',接收类型为string;
names:列名,接收数据类型为array;
header:将某行数据作为列名,默认为infer,表示自动识别;
encoding:文件编码格式,接收类型为特定的string类型,如'utf-8','gbk'等;
nrows:表示读取文件前N行,默认为None,接收int型。

常用样本:pandas.read_csv(input,sep=';',names=[u'姓名',u'年龄',u'身高',u'体重'],encoding='utf-8',nrows=10000)

此处代表的意思是读取路径为input的csv文件;

文件中行分割符为    ';'    ;

names代表文件列名即此处有4列:姓名,年龄,身高,体重,此处注意,因分隔符将一行分为分隔符的数量加一 个列,因此names中的列名数量应当与数量加一相等。此处提一下为什么需要将列名前加'u',因为python版本的不同,即常用的2.7和3.6,其中2.7版本的字符串类型有2种:unicode和非Unicode类型,而3.6版本的字符串类型只有Unicode类型。简而言之,如果使用的是3.*的版本不必理会'u',而如果python版本使用的是2.*的话,必须添加'u'作为列名开头。

encoding代表使用的文件的编码方式为utf-8;

nrows代表读取文件的前10000行,此处讲一下这个参数,本人觉得这个参数作用很方便,因为本人前段时间处理一些数据文件,而数据文件却又挺大,编写代码的过程中需要经常调试代码,如果不加这个参数每次代码都会将一个很大的文件全部读取完才会运行下面的代码,读取文件十分耗时。所以如果处于代码调试状态下,可以先加上这个参数,方便调试。

4.pandas中一些细节操作

准备说明:df为dataframe类型

数据去重操作:df=df.drop_duplicates().reset_index().drop('index',axis=1)

函数drop_duplicates()为行去重,即去掉行内容相同的其它行的数据。

reset_index()为重置df的index值,但此函数会将原本的index作为一个新的列加入到df中,所以此处需要第三步。

drop('index',axis=1)删掉第二步中原本的index列,axis为选择是行还是列,0为行,1为列。此处为列。

数据去空值操作:df=df[~df.T.isnull().any()]

③数据时间类型转换:pandas.to_datetime(df['时间'])

pandas时间类型其他的博文里有很多详细介绍,此处略写。

但是此处有一个关于时间比较的一个idea,本人之前判断pandas中时间比较,但时间模块中时间类型过多,比较时经常需要将数据转换为timestamp然后转换datetime,然后进行比较。而时间模块中类型转化函数却又过于复杂,几经研究。发现将时间类型全部转化为字符串格式也是可以比较时间大小的。

如'2017-05-02'和'2018-02-22'比较大小,

因字符串比较大小会先开始比较字符串第0个元素,即'2',

如果相等则会开始比较第1个元素'0',

如果相等就继续重复之前的步骤,直到某一对元素比较出大小,

因此'2017-05-02'<'2018-02-22'

④数据分组:df=df.groupby('性别').sum()

groupby顾名思义,即为分组。根据列名分组运算,此处根据性别分组,然后做求和运算。

其中sum()可代替,但是不可以没有。如果没有返回的是一个内存地址。

sum()可代替为:

count():计算分组的数目,包括缺失值。

head():返回前n个数。

max():返回每组最大值。

mean():返回每组平均值。

median():返回每组中位数。

cumcount():对每个分组中的组员进行标记。

size():返回每组大小。

min():返回每组最小值。

std():返回每组标准差。

此处注意:上述的一些方法有些仅对于dataframe中数据类型为 int或者 float型等参数进行操作。

例如,如果dataframe中有字符串类型,使用sum()会将分组中所有字符串拼接到一起。

groupby的几个常见的搭配操作。

例如df=df.groupby('性别').sum()后,df.plot()。可直接画出df的折线图。

df.reset_index()可以将df重新转换为dataframe类型。

5.数据写出

根据数据读取板块,所以说一下to_csv()数据写出,常用参数有:

output:文件输出路径。

sep:文件分割符,默认为‘,’。

header:是否将文件列名写出,默认为True。

index:是否将文件行名写出,默认为True。

encoding:文件编码格式。

mode:文件写入模式,默认为‘w’

w 以写方式打开,
W 文件若存在,首先要清空,然后(重新)创建
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )

常见样本: df.to_csv(output,header=False,index=False,encoding='utf-8')
此处代表的意思为将dataframe->df写出到output路径上,不写出文件行名和列名,文件编码格式为utf-8。
6.写到最后的话

    因笔者也是正在学习关于大数据分析,所以会将平时经常出现的一些问题讲出来,并加上自己的理解,所以可能有些地方有错误。欢迎大牛指正。





  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值