持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
总计:今天是十月更文计划第八天,第十四篇
继续上一篇的pandas实战
对重复值的处理 3、重复值
duplicated(subset=None, keep='first')
参数subset用来指定判断不同行的数据是否重复时所依据的一列或多列,默认使用整行所有列的数据进行比较;
参数keep='first'时表示重复数据的第一次出现标记为False,keep='last'时表示重复数据的最后一次出现标记为False,keep=False时表示标记所有重复数据为True。
drop_duplicates(subset=None, keep='first', inplace=False)
参数subset和keep的含义与duplicated()方法类似;
参数inplace=True时表示原地修改,此时duplicated()方法没有返回值,inplace=False时表示返回新的DataFrame结构而不对原来的DataFrame做任何修改。
实战代码如下:
#处理超市交易数据中的异常值
import pandas as pd
# 设置列对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 读取全部数据,使用默认索引
df = pd.read_excel(r'超市营业额2.xlsx')
print('查看交易额低于200的数据'.ljust(20,'='))
print(df[df.交易额<200])
#把交易额<200的交易额,映射为一个lambda表达式计算的结果
df.loc[df.交易额<200, '交易额'] = df[df.交易额<200]['交易额'].map(lambda num: num*1.5)
print('上浮50%之后仍低于200的数据'.ljust(20,'='))
print(df[df.交易额<200])
print('查看交易额高于3000的数据'.ljust(20,'='))
print(df[df['交易额']>3000])
print('交易额低于200或高于3000的数据'.ljust(20,'=')) #用或运算
print(df[(df.交易额<200) | (df.交易额>3000)])
# 把低于200的交易额都替换为固定的200
df.loc[df.交易额<200, '交易额'] = 200
print('交易额低于200或高于3000的数据'.ljust(20,'='))
print(df[(df.交易额<200) | (df.交易额>3000)])
# 把高于3000的交易额都替换为固定的3000
df.loc[df.交易额>3000, '交易额'] = 3000
print('交易额低于200或高于3000的数量'.ljust(20,'='))
print(df[(df.交易额<200) | (df.交易额>3000)]['交易额'].count()) #统计交易额<200或者交易额>3000的那些
输出的结果如下:
对缺省值的处理:
print('丢弃缺失值之后的行数'.ljust(20,'='))
print(len(df.dropna()))
print('包含缺失值的行'.ljust(20,'='))
print(df[df['交易额'].isnull()]) #isnull为真就是缺失值
print('使用固定值替换缺失值'.ljust(20,'='))
# 深复制,不影响原来的df
dff = deepcopy(df)
dff.loc[dff.交易额.isnull(),'交易额'] = 1000 #“交易额”中存在缺失值的“交易额”列的值都改成1000
print(dff.iloc[[110,124,168],:]) #查看第110,124和168行的所有列的数据
print('使用每人交易额均值替换缺失值'.ljust(20,'='))
dff = deepcopy(df)
for i in dff[dff.交易额.isnull()].index: #遍历dff“交易额”缺失值的行的索引
#对于每一个索引中,交易额列的数据,替换为 表中名字为=i索引所在行的名字的所有交易额的平均值
dff.loc[i, '交易额'] = round(dff.loc[dff.姓名==dff.loc[i,'姓名'], '交易额'].mean())
print(dff.iloc[[110,124,168],:]) #再次查看之前缺失值存在的行
print('使用整体均值的80%填充缺失值'.ljust(20,'='))
#用字典指定填充的方式,原地填充
df.fillna({'交易额': round(df['交易额'].mean()*0.8)}, inplace=True)
print(df.iloc[[110,124,168],:])
输出的结果如下;