pandas_处理异常值缺失值重复值数据差分

knowmore0 2020-05-07

# 处理异常值缺失值重复值数据差分
import pandas as pd
import numpy as np
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

# 异常值

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r‘C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx‘)

# 查看交易额低于 2000 的三条数据
# dataframe[dataframe.交易额 < 2000]
dataframe[dataframe.交易额 < 2000][:3]
‘‘‘
   工号  姓名      日期         时段  交易额    柜台
1  1002  李四  20190301  14:00-21:00    1800  化妆品
2  1003  王五  20190301   9:00-14:00     800    食品
3  1004  赵六  20190301  14:00-21:00    1100    食品
‘‘‘
# 查看上浮了 50% 之后依旧低于 1500 的交易额,查看 4 条数据
dataframe.loc[dataframe.交易额 < 1500,‘交易额‘] = dataframe[dataframe.交易额 < 1500][‘交易额‘].map(lambda num:num*1.5)
dataframe[dataframe.交易额 < 1500][:4]
‘‘‘
    工号  姓名      日期         时段  交易额      柜台
2   1003  王五  20190301   9:00-14:00  1200.0      食品
4   1005  周七  20190301   9:00-14:00   900.0    日用品
5   1006  钱八  20190301  14:00-21:00  1050.0    日用品
6   1006  钱八  20190301   9:00-14:00  1275.0  蔬菜水果
‘‘‘
# 查看交易额大于 2500 的数据
dataframe[dataframe.交易额 > 2500]
‘‘‘
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
‘‘‘
# 查看交易额低于 900 或 高于 1800 的数据
dataframe[(dataframe.交易额 < 900)|(dataframe.交易额 > 1800)]
‘‘‘
    工号  姓名      日期        时段  交易额    柜台
0   1001  张三  20190301  9:00-14:00  2000.0  化妆品
8   1001  张三  20190302  9:00-14:00  1950.0  化妆品
12  1005  周七  20190302  9:00-14:00   870.0  日用品
16  1001  张三  20190303  9:00-14:00  1950.0  化妆品
‘‘‘
#  将所有低于 200 的交易额都替换成 200
dataframe.loc[dataframe.交易额 < 200,‘交易额‘] = 200

# 查看低于 1500 的交易额个数
dataframe.loc[dataframe.交易额 < 1500,‘交易额‘].count()
# 9

# 将大于 3000 元的都替换为 3000 元
dataframe.loc[dataframe.交易额 > 3000,‘交易额‘] = 3000

# 缺失值

# 查看有多少行数据
len(dataframe)
# 17

# 丢弃缺失值之后的行数
len(dataframe.dropna())
# 17

# 包含缺失值的行
dataframe[dataframe[‘交易额‘].isnull()]
‘‘‘
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
‘‘‘
# 使用固定值替换缺失值
# dff = copy.deepcopy(dataframe)
# dff.loc[dff.交易额.isnull(),‘交易额‘] = 999
# 将缺失值设定为 999
# dff.iloc[[1,4,17],:]

# 使用交易额的均值替换缺失值
# dff = copy.deepcopy(dataframe)
# for i in dff[dff.交易额.isnull()].index:
#     dff.loc[i,‘交易额‘] = round(dff.loc[dff.姓名 == dff.loc[i,‘姓名‘],‘交易额‘].mean())
# dff.iloc[[1,4,17],:]

# 使用整体均值的 80% 填充缺失值
# dataframe.fillna({‘交易额‘:round(dataframe[‘交易额‘].mean() * 0.8)},inplace = True)
# dataframe.iloc[[1,4,16],:]


# 重复值
dataframe[dataframe.duplicated()]
‘‘‘
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
‘‘‘
# dff = dataframe[[‘工号‘,‘姓名‘,‘日期‘,‘交易额‘]]
# dff = dff[dff.duplicated()]
# for row in dff.values:
#     df[(df.工号 == row[0]) & (df.日期 == row[2]) &(df.交易额 == row[3])]


# 丢弃重复行
dataframe = dataframe.drop_duplicates()

# 查看是否有录入错误的工号和姓名
dff = dataframe[[‘工号‘,‘姓名‘]]
dff.drop_duplicates()
‘‘‘
   工号  姓名
0  1001  张三
1  1002  李四
2  1003  王五
3  1004  赵六
4  1005  周七
5  1006  钱八
‘‘‘

# 数据差分
# 查看员工业绩波动情况(每一天和昨天的数据作比较)
dff = dataframe.groupby(by = ‘日期‘).sum()[‘交易额‘].diff()
‘‘‘
日期
20190301       NaN
20190302    1765.0
20190303   -9690.0
Name: 交易额, dtype: float64
‘‘‘
dff.map(lambda num:‘%.2f‘%(num))[:5]
‘‘‘
日期
20190301         nan
20190302     1765.00
20190303    -9690.00
Name: 交易额, dtype: object
‘‘‘
# 数据差分
# 查看张三的波动情况
dataframe[dataframe.姓名 == ‘张三‘].groupby(by = ‘日期‘).sum()[‘交易额‘].diff()[:5]
‘‘‘
日期
20190301      NaN
20190302    850.0
20190303   -900.0
Name: 交易额, dtype: float64
‘‘‘

2020-05-07

相关推荐