实战1--航空公司客户价值分析(数据清洗篇)

根据所获得的数据,处理不符合实际情况的数据

常用处理方法:

  • 直接丢弃异常值(包括重复数据
  • Pandas:drop()/dropna()/drop_duplicated()
  • 用一个新的属性、值替代原值(中位数、众数等)
  • Pandas:fillna()
  • 针对连续型的数值,可以用插值
  • Pandas:interpolate()
    小数据练习:
    去除空值、标注异常值、去除重复值等
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 3, 5, 6], 'B': ['B1', 'B2', 'B3', 'B2', 'B5', 'B6'],
                   'C': [1.0, 2.5, None, 4.0, 5.0, 6.0], 'D': ['D1', 'D2', 'E3', 'D4', None, 'D5'],
                   'E': [0.1, 8.0, 10.0, 12.0, 9.0, 12.0]})
print(df)
# 数值的空值表示为NaN,而字符串的空值则表示为None
print(df.isnull())
# 去除所有空值
print(df.dropna())
# 去除部分空值(删除C列的空值)
print(df.dropna(subset=['C']))
# 查看重复值
print(df.duplicated(['A']))
# A为重复的且B也是重复的才能算是重复
print(df.duplicated(['A','B']))
# keep 的值有: first/last/false false表示都不要
print(df.drop_duplicates(['A'], keep='first'))
# 标注异常值
print(df.fillna('b*'))
# 异常值填入均值
print(df.fillna(df['C'].mean()))
# 填入插值
# 相邻两值的均值
print(df['C'].interpolate())
# 样条插值,其他方法名称自行百度
print(df['C'].interpolate(method="spline", order=3))
# 四分位数
up_q = df['E'].quantile(0.75)
low_q = df['E'].quantile(0.25)
# 查看间距
q_int = up_q - low_q
k = 1.5
# 去除D列异常值(数值大于low_q - k*q_int,并且数值小于up_q + k*q_int)
print([df[df['E'] > low_q - k*q_int][df['E'] < up_q + k*q_int]])
# 删除指定行
print(df.drop(1))
# 删除D列中不是以D开头的值
print(df[[True if item.startswith('E') else False for item in list(df['D'].values)]])

实战数据清洗过程

根据实际情况,排除不可能存在的数据。每个项目中去除数据都需要根据使用场景而言。
例如某人的购物记录:不存在消费次数大于0而消费金额小于0的情况存在等

import pandas as pd


data_file = '..\\project_07\\version2_chapter7\\demo\\data\\air_data.csv'
cleaned_file = '..\\project_07\\version2_chapter7\\demo\\tmp\\data_cleaned.csv'

# 读取数据
airline_data = pd.read_csv(data_file, encoding='utf-8')
print('原始数据的形状为:', airline_data.shape)

# 去除票价记录为空的记录
airline_not_null = airline_data.loc[airline_data['SUM_YR_1'].notnull() & airline_data['SUM_YR_2'].notnull(), :]
print('删除缺失记录后数据的形状为:', airline_not_null.shape)

# 只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录
index1 = airline_not_null['SUM_YR_1'] !=0
index2 = airline_not_null['SUM_YR_2'] !=0
index3 = (airline_not_null['SEG_KM_SUM'] > 0) & (airline_data['avg_discount'] != 0)
# 去除年龄大于100的记录
index4 = airline_not_null['AGE'] > 100
airline = airline_data[(index1|index2) & index3 & ~index4]
print('数据清洗后数据的形状为:', airline.shape)

# 保存结果
airline.to_csv(cleaned_file)

注:项目来源于书《Python数据分析与挖掘实战(第二版)》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值