資料清洗之資料預處理 學習筆記

2021-10-03 17:09:39 字數 4713 閱讀 4586

電單車的銷售情況資料

**:

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...