7.1处理缺失数据

滤除确实数据
dropna方法
In [90]: data.dropna(axis='columns',how='all')
In [105]: df
Out[105]:
0 1 2
0 -0.592544 NaN NaN
1 -1.100125 NaN NaN
2 -0.010423 NaN -1.544200
3 -1.695543 NaN -0.841319
4 -0.631140 0.201259 1.217320
5 -1.445301 0.135728 -1.025898
6 0.661475 -0.425209 -0.838642
thresh参数:将非空值为参数值以上的全部留下
In [102]: df.dropna(thresh=2)
Out[102]:
0 1 2
2 -0.010423 NaN -1.544200
3 -1.695543 NaN -0.841319
4 -0.631140 0.201259 1.217320
5 -1.445301 0.135728 -1.025898
6 0.661475 -0.425209 -0.838642
填补缺失数据
填补所以的缺失数据
df.fillna('a')
若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值:
In [113]: df.fillna({1:0.5,2:1})
Out[113]:
0 1 2
0 -0.592544 0.500000 1.000000
1 -1.100125 0.500000 1.000000
2 -0.010423 0.500000 -1.544200
3 -1.695543 0.500000 -0.841319
4 -0.631140 0.201259 1.217320
5 -1.445301 0.135728 -1.025898
6 0.661475 -0.425209 -0.838642
fillna函数支持就地修改:修改参数inplace=True
7.2 数据转换
检验各行是否重复
data.duplicated()
直接删除重复的行
data.duplicated()
指定要进行比较的列
data.duplicated(['k1','k2'])
利用函数或映射进行数据转换
Series.str.lower():将Series对象中的所有字母改为小写
Series对象可以接收一个字典或一个函数。
这样一个例子:
In [205]: data
Out[205]:
food ounces
0 bacon 4.0
1 pulled pork 3.0
2 bacon 12.0
3 Pastrami 6.0
4 corned beef 7.5
5 Bacon 8.0
6 pastrami 3.0
7 honey ham 5.0
8 nova lox 6.0
要为该DataFrame对象添加动物来源列
先写一个字典:关于动物和肉的映射
meat_to_animal = {
'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'
}
根据映射关系将Series对象中相应的值替换掉
In [210]: data['animal']=lowercased.map(meat_to_animal)
使用函数来实现
data['animal']=data['food'].map(lambda x:meat_to_animal[x.lower()])
关于替换元素,有一种更直接的方法:使用replace
#将对象中的-999,-1000全部替换成NA
data.replace([-999,-1000],NA)
#将对象中的-999,-1000分别替换成1和2
data.replace([-999,-1000],[1,2])
或者传入一个字典
data.replace({-999:1,-1000:2})
重命名轴索引
和Series对象一样,Index对象也可以通过其自身的map方法来修改(传入一个字典或函数)
In [246]: data.index
Out[246]: Index(['Ohio', 'Colorado', 'New York'], dtype='object')
In [247]: data.index.map(lambda x:x[:4].upper())
Out[247]: Index(['OHIO', 'COLO', 'NEW '], dtype='object')
或者使用rename方法(与上面起到相同的效果)
In [252]: data.rename(index=str.title,columns=str.upper)
Out[252]:
ONE TWO THREE FOUR
Ohio 0 1 2 3
Colorado 4 5 6 7
New York 8 9 10 11
当然也可以传入字典
离散化和面元划分
用于将一组连续的数据划分为各个区间。
使用pandas的cut方法
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
bins=[18,25,35,60,100]
pd.cut(ags.bins)
cut方法得到的是一个Categorical对象,它表示被划分的连续数据各个处于的分类区间。即面元
划分时可以传递面元的名称:labels参数
In [274]: cats=pd.cut(ages,bins,labels=group_names)
In [275]: cats
如果传入cut的不是确切的划分,而是数字,则会均匀的分成数字段
#precision参数表示有效数字的位数
pd.cut(data,4,precision=2)
qcut:和cut相似,但分布更均匀
检测和过滤异常值
过滤或变换异常值(outlier)在很大程度上就是运用数组运算
排列和随机采样
产生固定数目的样本:对象.sample方法
choice=pd.Series(np.random.randint(20,size=8))**
choice.sample(n=4)#选取4个随机样本
若选取数目大于集合元素数,且参数replace设为True(允许重复),则随机赋值样本
choice.sample(n=9,replace=True)
计算指标和哑变量
7.3 字符串操作


正则表达式
pandas的矢量化字符串
由于对象的map方法的存在,我们可以很方便地修改对象中的值。
但对于那些对象元素有残缺的数据,应用map方法则会报错。
data = {'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com',
.....: 'Rob': 'rob@gmail.com', 'Wes': np.nan}
data = pd.Series(data)
se.map(lambda x:re.sub('com','cn',x))
TypeError: expected string or bytes-like object
解决方法:修改元素前做个简答的判断即可
se.map(lambda x:re.sub('com','cn',x) if x is not NA else x)

网友评论