前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据清洗与准备(2)

数据清洗与准备(2)

作者头像
python数据可视化之路
发布2023-02-23 21:17:08
6200
发布2023-02-23 21:17:08
举报

1 处理缺失值

(1) 过滤缺失值(见上一篇文章)

(2) 补全缺失值

有时候我们并不是想要过滤缺失值,而是需要补全数据。大多数情况下,主要使用fillna方法补全缺失值,调用该方法时,可以传入一个常数来替代缺失值。

代码语言:javascript
复制
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(4, 3))
df.iloc[:2, 1] = np.nan
df.iloc[:2, 2] = np.nan
print(round(df, 2)) #保留两位数字
round(df.fillna(0), 2) #缺失值赋值为0,保留两位数字
-----结果-----
df:
     0     1     2
0  0.35   NaN   NaN
1 -1.18   NaN   NaN
2 -1.26 -0.62 -1.28
3 -1.44  0.20  0.55
重新赋值:
      0    1    2
0  0.35  0.00  0.00
1  -1.18  0.00  0.00
2  -1.26  -0.62  -1.28
3  -1.44  0.20  0.55

为不同列赋不同的填充值:

代码语言:javascript
复制
round(df.fillna({1: 0.5, 2: 2.0}), 2) #为第二列缺失值赋0.5,第三列赋值为2
-----结果-----
    0     1    2
0  0.35  0.50  2.00
1  -1.18  0.50  2.00
2  -1.26  -0.62  -1.28
3  -1.44  0.20  0.55

使用插值方法进行填充:

代码语言:javascript
复制
print(df.fillna(method='bfill')) #后向填充
print(df.fillna(method='bfill', limit=1)) #后向填充且只填充1个
-----结果-----
后向填充:
     0         1         2
0  0.347261 -0.622227 -1.277521
1 -1.179992 -0.622227 -1.277521
2 -1.258739 -0.622227 -1.277521
3 -1.442985  0.195110  0.553435
后向填充且只填充1个:
      0         1         2
0  0.347261       NaN       NaN
1 -1.179992 -0.622227 -1.277521
2 -1.258739 -0.622227 -1.277521
3 -1.442985  0.195110  0.553435

fillna函数参数

函数

描述

value

标量值或字典类对象用于填充缺失值

method

插值方法,如果没有其他参数,默认为'ffill'

axis

需要填充的轴,默认axis=0

inplace

修改被调用的对象,而不是生成一个备份

limit

用于前向或后向填充时最大的填充范围

2 数据转换

(1)删除重复值

删除重复值用到了drop_duplicates方法:

代码语言:javascript
复制
df = pd.DataFrame({'k1':['one', 'two']*3+['two'], 'k2':[1, 1, 2, 3, 3, 4, 4]})
print(df.duplicated()) #检查是否每一行存在重复
print(df.drop_duplicates()) #删除duplicated方法中为False的部分
-----结果-----
0    False
1    False
2    False
3    False
4    False
5    False
6     True
删除后:
    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4

基于“k1”列删除重复值:

代码语言:javascript
复制
print(df.drop_duplicates(['k1'])) #基于k1列删除重复值
-----结果-----
    k1  k2
0  one   1
1  two   1

duplicated和drop_duplicated默认都是保留第一个观测到的值,传入参数last="last"将会返回最后一个:

代码语言:javascript
复制
print(df.drop_duplicates(['k1'], keep = 'last')) #保留最后一个值
-----结果-----
    k1  k2
4  one   3
6  two   4

(2)使用函数或映射进行数据转换

对于许多数据集,可能希望基于DataFrame中的数组、列或列中的数值进行一些转换,测试数据(data)如下,包含九类肉的名称和价格:

假设要添加一列用于表明每种食物的动物肉类型,映射如下:

代码语言:javascript
复制
meat_to_animal = {'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 
                  'corned beef': 'cow', 'honey ham': 'pig', 'nova lox': 'salmon'}

Series对象的map方法可以接受一个函数或包含映射关系的字典型对象,但是在data中有一些肉类大写了,我们需要转换成小写。

代码语言:javascript
复制
low_food = data['food'].str.lower() #利用Series的str.lower方法转换成小写
low_food:
0          bacon
1    pulled pork
2          bacon
3       pastrami
4    corned beef
5          bacon
6       pastrami
7      honey ham
8       nova lox
代码语言:javascript
复制
data['animal'] = low_food.map(meat_to_animal) #新增一列animal表示肉类所属哪种动物
data:
    food  price  animal
0  bacon  4.0  pig
1  pulled pork  3.0  pig
2  bacon  12.0  pig
3  Pastrami  6.0  cow
4  corned beef  7.5  cow
5  Bacon  8.0  pig
6  pastrami  3.0  cow
7  honey ham  5.0  pig
8  nova lox  6.0  salmon

以上工作也可以通过一个函数完成:

代码语言:javascript
复制
data['animal'] = data['food'].map(lambda x: meat_to_animal[x.lower()])
data:
结果同上一步

(3)替代值

替代值主要是通过replace函数实现,例如data.replace(-999, 0)表示将data中的-999替换成0;同样的也可以传入列表,例如data.replace([-999, np.nan], 0)表示将-999和缺失值替换为0;data.replace([-999, np.nan], [0, 1])表示将-999替换成0,将缺失值替换为1;也可以传递字典,例如data.replace({-999: 0, np.nan: 1})也表示将-999替换成0,将缺失值替换为1。

今天的内容就介绍到这里,比较重要的内容有补全缺失值和替代值,下一篇将简单介绍重命名轴索引和检测过滤异常值。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python数据可视化之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档