摩托车的销售情况数据
import numpy as np
import pandas as pd
import os
os.chdir(r‘F:\CSDN\课程内容\代码和数据‘)
df = pd.read_csv(‘MotorcycleData.csv‘,encoding = ‘gbk‘,na_values=‘Na‘)
na_values=‘used‘  对所有的‘used’的数据写成缺失值
df.head(5)
# 自定义一个函数
def f(x):
    if ‘$‘ in str(x):
        x = str(x).strip(‘$‘)           # 去除
        x = str(x).replace(‘,‘,‘‘)      # 替换
    else:
        x = str(x).replace(‘,‘,‘‘)
    return float(x)
df[‘Price‘] =  df[‘Price‘] .apply(f)
df[‘Mileage‘] = df[‘Mileage‘].apply(f)
print (‘数据集是否存在重复观测: \n‘, any(df.duplicated()))
df[df.duplicated()] #查看那些数据重复(全部)
np.sum(df.duplicated()) #计算重复数量
df.drop_duplicates() #删除所有变量都重复的行, 注意没有加inplace = True,只会是视图上删除,只有加了才对原始数据改动
df.drop_duplicates(subset= [‘Condition‘,‘Condition_Desc‘,‘Price‘,‘Location‘],inplace=True) #按照两个变量重复 来 来去重
df.info()
df.apply(lambda x: sum(x.isnull())/len(x),axis= 0) #缺失比例,超过90%或95%就可以扔了
#删除法
df.dropna() #直接删除法
df.dropna(how=‘any‘,axis = 1 ) #只要有缺失,就删除这一列
df.dropna(how=‘all‘,axis = 1 ) #只有全部缺失,才删除这一列
df.dropna(how=‘any‘,axis = 0) #只要有缺失,就删除这一行,等价于df.dropna()
df.dropna(axis = 0,how=‘any‘,subset=[‘Condition‘,‘Price‘,‘Mileage‘]) # 1代表列,0代表行,只要有缺失,就删除这一行,基于三个变量
在数据分析中,实际上大部分时候都是按照行来进行删除的,很少会基于列来进行删除 列代表的是变量,是否删除删除列很多时候主要取决于缺失比例
使用替换法进行缺失值的填补
df.head(10)
df.Mileage.fillna(df.Mileage.mean()) # 年龄这里列 用均值填补
df.Mileage.fillna(df.Mileage.median()) #中位数填补
df[df[‘Exterior_Color‘].isnull()]
df.Exterior_Color.fillna(df.Exterior_Color.mode()[0]) #众数填补mode()[0],众数可能有好几个,后面表示取第一个
df.fillna(20) # 所有缺失用20填补
# 车的颜色使用众数,里程树使用均值
df.fillna(value = {‘Exterior_Color‘:df.Exterior_Color.mode()[0],‘Mileage‘:df.Mileage.mean()})
这里还是没有加inplace=True,所以数据本身没变,只是视图变化了
df[‘Exterior_Color‘].fillna(method=‘ffill‘) #前向填补
df[‘Exterior_Color‘].fillna(method=‘bfill‘) #后向填补
df.Price和df[‘Price‘]的作用应该是一样的
# 判断年龄有什么异常值
# 剔除户主姓名,户主身份证号和年龄有缺失的样本
df.dropna(axis = 0,how=‘any‘,subset=[‘户主姓名‘,‘户主身份证号‘,‘age‘],inplace = True) #1代表列,0代表行,只要有缺失,就删除这一行,基于三个变量
# 异常值检测之标准差法
xbar = df.Price.mean()     均值
xstd = df.Price.std()      标准差
print(‘标准差法异常值上限检测:\n‘,any(df.Price> xbar + 2.5 * xstd))
print(‘标准差法异常值下限检测:\n‘,any(df.Price< xbar - 2.5 * xstd))
# 异常值检测之箱线图法
Q1 = df.Price.quantile(q = 0.25)      取25%为分位数
Q3 = df.Price.quantile(q = 0.75)
IQR = Q3 - Q1                         分位差
print(‘箱线图法异常值上限检测:\n‘,any(df.Price > Q3 + 1.5 * IQR))
print(‘箱线图法异常值下限检测:\n‘,any(df.Price < Q1 - 1.5 * IQR))
df.Price.describe()# 对价格进行描述性统计

import matplotlib.pyplot as plt
%matplotlib inline
df.Price.plot(kind =‘box‘)
# 导入绘图模块
import matplotlib.pyplot as plt
# 设置绘图风格
plt.style.use(‘seaborn‘)
# 绘制直方图(30条柱子,密度以概率密度)
df.Price.plot(kind = ‘hist‘, bins = 30, density = True)
# 绘制核密度图
df.Price.plot(kind = ‘kde‘)
# 图形展现
plt.show()
# 用99分位数和1分位数替换
#计算P1和P99
P1 =df.Price.quantile(0.01); P99 = df.Price.quantile(0.99)
#先创建一个新变量,进行赋值,然后将满足条件的数据进行替换
df[‘Price_new‘] = df[‘Price‘]
df.loc[df[‘Price‘] > P99,‘Price_new‘]  = P99
df.loc[df[‘Price‘] < P1,‘Price_new‘]  = P1
回忆:#注意loc是标签 #注意iloc是位置
df[[‘Price‘,‘Price_new‘]].describe()
 
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
参数:
df.head(5)
df[‘Price_bin‘] =  pd.cut(df[‘Price_new‘],5,labels=range(5))
#切分五大类,把这五份分别取0~5的标签
df[‘Price_bin‘].hist()
df[‘Price_new‘].describe()
w = [100,1000,5000,10000,20000,50000]
df[‘Price_bin‘] =  pd.cut(df[‘Price_new‘], bins =w,labels=[‘低‘,‘便宜‘,‘划算‘,‘中等‘,‘高‘],right=False)
df[‘Price_bin‘].value_counts()
k = 5
w = [1.0*i/k for i in range(k+1)] 
w
这里w的作用就是分位
值为[0.0,0.2,0.4,0.6,0.8,1.0]
也就是“等频”
df[‘Price_bin‘] = pd.qcut(df[‘Price_new‘],w,labels=range(k))
# 这里的w赋值的是q这个变量
df[‘Price_bin‘].hist()
k = 5
w1 = df[‘Price_new‘].quantile([1.0*i/k for i in range(k+1)])#先计算分位数,在进行分段
w1[0] = w1[0]* 0.95 # 最小值缩小一点
w[-1] = w1[1]* 1.05 # 将最大值增大一点, 目的是为了确保数据在这个范围内
w1
df[‘Price_bin‘] = pd.cut(df[‘Price_new‘],w1,labels=range(k))
df[‘Price_bin‘].hist()
#在上面这个例子中,有两种分的方法,其中w啊是先划分一个等频段,w1是先计算了数据本身的等频区间。
原文:https://www.cnblogs.com/xingnie/p/12264505.html