第7章 数据清洗和准备

7.1处理缺失数据

image.png

滤除确实数据

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 字符串操作

image.png
image.png

正则表达式

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)
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容