处理缺失值
先导入需要用的库
import pandas as pd
import numpy as np
from pandas import DataFrame
from pandas import Series
下面开始各种缺失值处理函数,其实只是罗列,具体的方法需要啥用啥
第一步:先检查缺失值
#检查缺失值
string_data=pd.Series(['aardvark','artichoke',np.nan,'avocado'])
string_data
string_data.isnull()
#none值也被当做缺失值处理
string_data[0]=None
string_data.isnull()
第二步:按照所需处理缺失值
from numpy import nan as na
#处理一维数组缺失值
data=pd.Series([1,na,3.5,na,7])
data.dropna()#等价于data[data.notnull()]
#处理表格缺失值
data=pd.DataFrame([[1.,6.5,3.],[1.,na,na],[na,na,na],[na,6.5,3.]])
cleaned=data.dropna()#去掉缺失值所在的行
data.dropna(how='all')#去掉表格中全部为缺失值的行
data[3]=na#当表格某一列全为空值
data.dropna(axis=1,how='all')#按照行的方向,删除全为空的一列
data.dropna(thresh=2)#显示除去nan值后剩下的非空元素大于2的行
#补全缺失值
data.fillna(0)
data.fillna({1:0.5,2:0,3:1.5})#运用字典填充缺失值,对应的字典名为列名,字典的值为需要填充的值
data.fillna(method='ffill',limit=2)#向前填充值,即将第一个空行之前的数据向后填补,limit限制填充个数
data.fillna(method='bfill')#向前填充值,即将最后一个非空行的数据向前填补
data.fillna(data.mean())#用各种描述性统计指标填充缺失值,比如mean,average等等
数据转换
重复值处理
data=pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,3,4,4]})
data
#检查重复值
data.duplicated()
#删除重复值,返回检查后为false的部分
data.drop_duplicates()
data['v1']=range(7)
#基于某列删除重复值
data.drop_duplicates(['k2'])
data.drop_duplicates(['k1'],keep='last')#keep参数返回最后到数据最后一行
函数或映射处理
data=pd.DataFrame({'food':['bacon','pulled pork','bacon','Pastrami','corned beef','Bacon','pastrami','honey ham','nova lox'],'ounce':[4,3,12,6,7.5,8,3,5,6]})
data
#创造映射条件,即归类
meat_to_animal={'bacon':'pig','pulled pork':'pig','pastrami':'cow','honey ham':'pig','nova lox':'salmon','corned beef':'cow'}
lowercased=data['food'].str.lower()
lowercased
#按照映射条件,增加对应的归类列,用map遍历
data['animal']=lowercased.map(meat_to_animal)
#等价于用lambda传入函数实现所有
data['food'].map(lambda x:meat_to_animal[x.lower()])
替代
#替代部分值
data=pd.Series([1.,-999.,2.,-999.,-1000.,3.])
data.replace(-999,np.nan)#替换某个值
data.replace([-999,-1000],np.nan)#替换多个值
data.replace([-999,-1000],[np.nan,0])#针对不同的值替换为不同的值
#上述等价于用字典传递
data.replace({-999:np.nan,-1000:0})
rename()重命名索引
data=pd.DataFrame(np.arange(12).reshape((3,4)),index=['Ohio','Colorado','NewYork'],columns=['one','two','three','four'])
transform=lambda x:x[:4].upper()#对行索引的前四个字母大写
data.index.map(transform)#用map制造映射条件
data.rename(index=str.title,columns=str.upper)#行索引首字母大写,列索引全部大写
data.rename(index={'Ohio':'INDIANA'},columns={'three':'peekaboo'})#利用字典,替换索引名
data.rename(index={'Ohio':'INDIANA'},inplace=True)#inplace确定为修改原有数据集
data
cut()将数据集离散化和分箱
ages=[20,22,25,27,21,23,37,31,61,45,41,32]
bins=[18,25,35,60,100]
cats=pd.cut(ages,bins)#将数据集按照区间进行分组,并且显示每个数据所在的区间
cats
cats.codes#codes显示ages分组数据标签
cats.categories#只显示类别
pd.value_counts(cats)#显示每个类别中有多少个数据
pd.cut(ages,[18,26,36,61,100],right=False)#right=False限制右区间为开区间
group_names=['youth','youngadult','middleaged','senior']#自定义箱名
pd.cut(ages,bins,labels=group_names)
data=np.random.rand(20)
pd.cut(data,4,precision=2)#将数据均匀分布为四组,显示每个数据所在的组,precision限制精确小数位数
data=np.random.randn(1000)
cats=pd.qcut(data,4)#基于样本分位数进行分箱,通过qcut使用样本分位数分箱,使得每组的数据样本量相等
pd.value_counts(cats)#导出每个组的数据个数
检测和过滤异常值
data=pd.DataFrame(np.random.randn(1000,4))
#先看总体情况
data.describe()
col=data[2]
#查看异常值数据
col[np.abs(col)>3]
print(data)
#查看异常值所在的行/列数据
data[(np.abs(data)>3).any(1)]#any(1)等价于any(axis=1),即加上限制条件为axis=1,沿着横轴方向但凡有一个元素绝对值大于3,显示所在行的数据
#修改异常值
data[np.abs(data)>3]=np.sign(data)*3#将绝对值大于3的数据赋值为其他值
#重新查看总体情况,看修复的效果
data.describe()
np.sign(data).head()
置换和随机抽样
#随机抽样
df=pd.DataFrame(np.arange(5*4).reshape((5,4)))
sampler=np.random.permutation(5)#生成一个给定长度的新顺序的整数数组,按照行随机排列的顺序
print(sampler)
df.take(sampler)#从df中查看对应几行的数据
df.sample(n=3)#从上述筛选后的表中随机筛选3行
choices=pd.Series([5,7,-1,6,4])
draws=choices.sample(n=10,replace=True)#随机抽取10个数据,replace=true表示可重复,为false表示不可重复
将数据转化为二元变量
#将数据转化为二元变量
df=pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
pd.get_dummies(df['key'])#得到每个key下对应的元素
dummies=pd.get_dummies(df['key'],prefix='key')#修改索引名
df_with_dummy=df[['data1']].join(dummies)#用join连接data1值与各个键下的二元变量数
df_with_dummy
字符串操作
#拆分字符串
val='a,b, guido'
val.split(',')
#strip()函数去掉字符串中多余的空格和换行
pieces=[x.strip() for x in val.split(',')]
pieces
#将逗号换符,连接数据
"::".join(pieces)
#检测和定位子字符串
'guido' in val
val.index(',')#返回第一个字符的位置,没有的话报错
val.find(':')#返回第一个字符的位置,没有的话返回-1
#字符串出现的次数
val.count(',')
#字符串替代
val.replace(',',"::")
val.replace(','," ")