数据分析之pandas学习笔记(五)

NaN缺失数据的处理

是否有NaN值
.isnull() 		返回一个布尔数组
.any()			数组中有Ture吗?
.all()				全为True吗?
df.dropna()删除NaN

pandas.DataFrame.dropna()官方文档

NaN --> 浮点值 Not a Number
Na --> Not available 不存在或未观测到的数据

.dropna()			默认丢失任何含有缺失值的值

.dropna(1)			对列操作

.dropna(how='all')	只丢弃全为NA的行,axis=1对列操作

.dropna(thresh=2)	假设.dropna()去除了6行,那么thresh=2则去除了前2

df.fillna()填充缺失值NaN

pandas.DataFrame.fillna()官方文档

.fillna(0)					可添加inplace=True就地修改

.fillna({1:0.5,2:0})		传入字典参数,第2列的NaN替为0.5,第3列NaN替为0

.fillna(method='fill',limit=2)	相当于Excel的下拉复制,粘贴2(填充NaN)

数据转换

去重

duplicated官方文档
drop_duplicated官方文档

drop_duplicated()详细用法

.duplicated()	返回布尔型Series,表示各行是否重复。(行值都一模一样才算重复)
				传入列标签,可以对列判断


.drop_duplicated() 行去重,(重复的数组标为False1, 列标签,对列判断
				   
				   2, 当keep='first'时,就是保留第一次出现的重复行,其余删除
				      当keep='last'时,就是保留最后一次出现的重复行,其余删除
				      当keep=False时,就是删除所有重复行
利用函数映射

用map()举个例子:

原始数据

data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
                              'Pastrami', 'corned beef', 'Bacon',
                              'pastrami', 'honey ham', 'nova lox'],
                    'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]
                    })

分类的数据

meat_to_animal = {
  'bacon': 'pig',
  'pulled pork': 'pig',
  'pastrami': 'cow',
  'corned beef': 'cow',
  'honey ham': 'pig',
  'nova lox': 'salmon'
}

添加一列,利用map()函数作肉类分类的映射

data['animal'] = data['food'].map(lambda x: meat_to_animal[x.lower()])

在这里插入图片描述

替换值
方法:

1,针对需求数据,进行数值运算 或者广播赋值

2.针对NaN缺失值数据,fillna()

3.map()或者apply()或者applymap()等函数,建立字典映射

4.最常用,replace()
				  单值替换replace(-999,np.nan,inplace=True)-999替为NaN    在原表操作
				  多值替换replace([-999,-1000][np.nan,0])
				  				-999替为NaN,-1000替为0
				  或者传入字典的形式进行值替换
				  		

重命名轴索引

方式一

用map或者apply函数

可以传入字典对象进行映射替换,或自己构建需求的函数
比如:

data.index = data.index.map(lambda x: x[:].upper())
实现了就地修改
方式二

若不是就地修改,想要得到转换版
用df.rename()
比如:

data.rename(index=str.title,columns=str.upper)
			或者传入字典进行替换index={},columns={}
			加inplace=True字段可以实现就地修改

pd.cut()和qcut()、离散化和面元划分(分类)

都只能对一维数组Series进行划分,不能划分DataFrame二维
pd.cut()

分切(切出想要份数的结果)
pandas.cut()官方文档
参数详解

cats = pd.cut(......)

cats.codes					得到一个Series数组,里面为0,1,2这样的索引标记

cats.categories				分组信息

pd.value_counts(cats)		频率计数
pd.qcut()

匀切(切出的结果中,每个分组,频率分布均匀,即划分出的数量基本一样)
pandas.qcut()官方文档
qcut参数详解,以及和cut的区别

两者的区别

在将一维连续数据分装到几个桶里的时候,可以利用pandas 的 cut和qcut函数

区别:

cut:
    按连续数据的大小分到各个桶里,每个桶里样本量可能不同,
	但是,每个桶相当于一个等长的区间,即:以数据的最大和最小为边界,等分成p个桶。

qcout: 
	与cut主要的区别就是每个桶里的样本数量是一定的。

检测和过滤异常值的例子

1, df.describe()

2, col = df[1]
   col[np.abs(col)>3]	找出某列中绝对值大于3的值

3,  df[(np.abs(df) > 3).any(1)]	找出全部绝对值超过3的值

对第三点的代码详细解释说明:
					np.abs(df>3) 给df数组中大于3的数加绝对值
					any(1)等价于any(axis=1),意思是哪几列为True
					(np.abs(df) > 3).any(1)意思是找出绝对值大于3的那些列
					df[...] 意思是显示 (若干)列
					
4,df.take([0,3],axis=1)		axis=1对列操作,取索引为0和3这两列

5,df02 = df01[['data']].jion(df)   将df表,(默认)左连接,到,df01表的['data']列的左侧
												相当于在df表右侧拼了个df01[‘data’]列
						

pd.get_dummies()虚拟变量 哑变量

在用这个方法之前,我们首先得了解,哑变量是干嘛用的,我在查阅资料的时候,就看到有人乱用方法,还提出了无意义的问题。

在这里插入图片描述这里附上链接,看看怎么用虚拟变量
机器学习总结-虚拟变量
什么是虚拟变量,怎么设置才正确

看完了之后,我们再看看虚拟变量pandas.get_dummies()方法如何使用
pandas.get_dummies官方文档

详细用法
运用实践
看完以上,我们再回过头来总结一下,方法如何使用:

在Series中:
				1,对字符串操作
				
				2,对数字操作
								 

下面举个例子,在Series中对字符串的用法

import pandas as pd
import numpy as np

data = np.random.randint(100,size=10)   #随机生成10个,0~100之间的数字
print(data)

bins = [0,3,10,20,30,50,100]
group_name = ['婴儿','儿童','青少年','成年人','中年人','老年人']
cuts = pd.cut(data,bins,labels=group_name)  #对10个数字,按区间进行划分,分类
print(cuts)

counts = pd.value_counts(cats)     对分完的类,进行计数
print(counts)
print('************')

a = pd.get_dummies(cuts)
print(a)

在这里插入图片描述举个例子,Series中对数字运用get_dummies()

data = pd.Series(np.random.randint(100,size=5))
print(data)
print('************************')
a  =pd.get_dummies(data)
print(a)

在这里插入图片描述

在DataFrame中:
				1,对字符串操作
				
				2,对数字操作  --> 无实际意义,无法达到预期效果。
								如果你硬是计较你DataFrame中的数字是有意义的,那请你全部str转成字符串再进行操作。

DataFrame例子懒得举了,基本上都差不多的。
就是DataFrame的内容全为数字,对数字的不能操作,除非转成str
你仔细想想,你实际运用中会对一个DataFrame表里的所有数字进行哑变量操作么= =?
Series中,对一列的数字进行哑变量操作,可能还有点实际意义。

正则匹配

正则匹配是个很大的一块内容,我只写一些= =我自己有用的笔记,详细的正则匹配学习另外去找资料看吧。
字符型匹配规则、贪婪匹配、re模块的方法

当然除了正则匹配,在爬虫中我们也会用到一些XPath匹配HTML标签中的内容
还有别的匹配,Emmm我也忘了,应该还有。不过不常用到。

我这里只写我自己的正则笔记= =,有空我再总结一个关于正则的详细笔记好了:

findall()   		返回所有匹配项			flags=re.IGNORECASE  -->忽略大小写
search()			只返回第一个匹配项
match()				只匹配字符串首部

字符串操作函数

在这里插入图片描述提几个pyhton常用的:
join()
split()
对字符串切割,或者正则,还是其他方面都非常常用。

这两个为一组

join()	 	对列表操作,返回字符串
split()		对字符串操作,返回一个列表

如: ['a','b','c'].join('-')   --> 	 'a-b-c'
    'a b c'.split(' ')		-->['a','b','c']
    

strip()
一般爬虫爬下来的数据有些 乱七八糟,有看不到的空格,可以strip()一下
len()
获取字符串长度
match()
findall()
这两个是正则里面用的
get()
获取指定索引下的字符

其他的好像。。不怎么常用。。以后处理字符串的时候,用到了,阔以回过头来看一看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值