電單車的銷售情況資料**:
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')
### 1. 重複值處理
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)
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()
### 2. 缺失值處理
#刪除法
df.dropna() #直接刪除法
df.dropna(how='any',axis = 1 ) #只要有缺失,就刪除這一列
df.dropna(how='any',axis = 0) #只要有缺失,就刪除這一行,等價於df.dropna()
axis = 0 或者 1代表的函式在資料集作用的方向,0代表沿著行的方向,1代表沿著列的方向
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]) #眾數填補
df.fillna(20) # 所有缺失用20填補
# 婚姻狀況使用眾數,年齡使用均值,農戶家庭人數使用中位數
df.fillna(value = )
df['exterior_color'].fillna(method='ffill') #前向填補
df['exterior_color'].fillna(method='bfill') #後向填補
### 3.異常值處理
異常值檢測可以使用均值的2倍標準差範圍,也可以使用上下4分位數差方法
# 判斷年齡有什麼異常值
# 剔除戶主姓名,戶主身份證號和年齡有缺失的樣本
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)
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')
# 繪製直方圖
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
df[['price','price_new']].describe()
### 4.資料離散化
'''pandas.cut(x, bins, right=true, labels=none, retbins=false, precision=3, include_lowest=false)
引數:x,類array物件,且必須為一維,待切割的原形式
bins, 整數、序列尺度、或間隔索引。如果bins是乙個整數,它定義了x寬度範圍內的等寬面元數量,但是在這種情況下,x的範圍在每個邊上被延長1%,以保證包括x的最小值或最大值。如果bin是序列,它定義了允許非均勻bin寬度的bin邊緣。在這種情況下沒有x的範圍的擴充套件。
right,布林值。是否是左開右閉區間,right=true,左開右閉,right=false,左閉右開
labels,用作結果箱的標籤。必須與結果箱相同長度。如果false,只返回整數指標面元。
retbins,布林值。是否返回面元
precision,整數。返回面元的小數點幾位
include_lowest,布林值。第乙個區間的左端點是否包含'''
df.head(5)
df['price_bin'] = pd.cut(df['price_new'],5,labels=range(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()
'''pandas.qcut(x, q, labels=none, retbins=false, precision=3, duplicates=』raise』)
引數:x
q,整數或分位數組成的陣列。
q, 整數 或分位數陣列 整數比如 4 代表 按照4分位數 進行切割
labels, 用作結果箱的標籤。必須與結果箱相同長度。如果false,只返回整數指標面元。
原理都是基於分位數來進行離散化'''
k = 5
w = [1.0*i/k for i in range(k+1)]
wdf['price_bin'] = pd.qcut(df['price_new'],w,labels=range(k))
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 # 將最大值增大一點, 目的是為了確保資料在這個範圍內
w1df['price_bin'] = pd.cut(df['price_new'],w1,labels=range(k))
df['price_bin'].hist()
大資料預處理之資料清洗
現實世界的資料常常是不完全的 有雜訊的 不一致的。資料清洗過程包括遺漏資料處理,雜訊資料處理,以及不一致資料處理。本節介紹資料清洗的主要處理方法。假設在分析乙個商場銷售資料時,發現有多個記錄中的屬性值為空,如顧客的收入屬性,則對於為空的屬性值,可以採用以下方法進行遺漏資料處理。1 忽略該條記錄 若一...
資料探勘 資料預處理之資料清洗
資料清洗 資料清洗作為資料預處理中的乙個步驟,主要用於處理由於資料倉儲中資料不完整 資料雜訊以及資料不一致導致的問題。有人可能質疑,為什麼要對資料進行清洗?忽略那些出問題的資料不行嗎?當然,視而不見確是一種應對策略,但作為資料探勘中的一環,沒有高質量的資料又談何挖掘的可信性。為此,對於資料資料探勘來...
Python 資料預處理與清洗(學習筆記)
import numpy as np import pandas as pd from matplotlib import pyplot as plt data pd.read csv file.csv encoding gbk data.info 檢視資料型別1 堆疊資料df1 data.iloc...