数据分析之Pandas学习笔记(五)
NaN缺失数据的处理
是否有NaN值
.isnull() 返回一个布尔数组
.any() 数组中有Ture吗?
.all() 全为True吗?
df.dropna()删除NaN
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
.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官方文档
.duplicated() 返回布尔型Series,表示各行是否重复。(行值都一模一样才算重复)
传入列标签,可以对列判断
.drop_duplicated() 行去重,(重复的数组标为False)
1, 列标签,对列判断
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()
获取指定索引下的字符
其他的好像。。不怎么常用。。以后处理字符串的时候,用到了,阔以回过头来看一看。