1、刪除重復元素
使用duplicated()函數檢測重復的行,返回元素為布爾類型的Series對象,每個元素對應一行,如果該行不是第一次出現,則元素為True
- keep參數:指定保留哪一重復的行數據
- 創建具有重復元素行的DataFrame
import pandas as pd from pandas import Series,DataFrame import numpy as np df = DataFrame(data=np.random.randint(0,100,size=(10,6))) #手動將df的某幾行設置成相同的內容 df.iloc[1] = [1,1,1,1,1,1] df.iloc[3] = [1,1,1,1,1,1] df.iloc[7] = [1,1,1,1,1,1] ============= 0 1 2 3 4 5 0 90 79 67 38 58 59 1 1 1 1 1 1 1 2 75 50 67 72 30 28 3 1 1 1 1 1 1 4 16 95 19 9 29 73 5 4 8 17 75 34 31 6 82 75 57 82 15 3 7 1 1 1 1 1 1 8 85 52 94 54 99 42 9 53 20 49 15 87 93
使用drop_duplicates()函數刪除重復的行
- drop_duplicates(keep='first/last'/False)
df.drop_duplicates(keep='first') =============== 0 1 2 3 4 5 0 90 79 67 38 58 59 1 1 1 1 1 1 1 2 75 50 67 72 30 28 4 16 95 19 9 29 73 5 4 8 17 75 34 31 6 82 75 57 82 15 3 8 85 52 94 54 99 42 9 53 20 49 15 87 93
1) replace()函數:替換元素
使用replace()函數,對values進行映射操作
DataFrame替換操作
- 單值替換
- 普通替換: 替換所有符合要求的元素:to_replace=15,value='e'
- 按列指定單值替換: to_replace={列標簽:替換值} value='value'
- 多值替換
- 列表替換: to_replace=[] value=[]
- 字典替換(推薦) to_replace={to_replace:value,to_replace:value}
df = DataFrame(data=np.random.randint(0,10,size=(6,5))) df.replace(to_replace=4,value='four') #把df中所有4替換成four df.replace(to_replace=1,value='one') # 同理但是不會影響原df
指定列
df.replace(to_replace={3:2},value='two') # 3這一列的2替換成two
2) map()函數:新建一列 , map函數並不是df的方法,而是series的方法
-
map()可以映射新一列數據
-
map()中可以使用lambd表達式
-
map()中可以使用方法,可以是自定義的方法
eg:map({to_replace:value})
-
注意 map()中不能使用sum之類的函數,for循環
- 新增一列:給df中,添加一列,該列的值為中文名對應的英文名
dic = { 'name':['周傑倫','張三','周傑倫'], 'salary':[20000,12000,20000] } df = DataFrame(data=dic) #映射關系表 dic = { '周傑倫':'jay', '張三':'tom' } df['e_name'] = df['name'].map(dic)
name salary e_name 0 周傑倫 20000 jay 1 張三 12000 tom 2 周傑倫 20000 jay
map當做一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數)
- 使用自定義函數
def after_sal(s): return s - (s-3000)*0.5 #超過3000部分的錢繳納50%的稅 df['after_sal'] = df['salary'].map(after_sal)
name salary e_name after_sal
0 周傑倫 20000 jay 11500.0
1 張三 12000 tom 7500.0
2 周傑倫 20000 jay 11500.0
apply和map都可以作為一種基於Series的運算工具,並且apply比map更快
df['salary'].apply(after_sal)
注意:並不是任何形式的函數都可以作為map的參數。只有當一個函數具有一個參數且有返回值,那么該函數才可以作為map的參數。
3. 使用聚合操作對數據異常值檢測和過濾
使用df.std()函數可以求得DataFrame對象每一列的標准差
- 創建一個1000行3列的df 范圍(0-1),求其每一列的標准差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
對df應用篩選條件,去除標准差太大的數據:假設過濾條件為 C列數據大於兩倍的C列標准差
std_twice = df['C'].std() * 2
df['C'] > std_twice df.loc[df['C'] > std_twice] indexs = df.loc[df['C'] > std_twice].index df.drop(labels=indexs,axis=0,inplace=True)
數據清洗
- 清洗空值
- df.dropna()
- df.fillna()
- 清洗重復值
- df.drop_duplicates()
- 清洗異常值
- 異常值判定的條件
- 異常值對應的行數據進行刪除
使用.take()函數排序
- take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序
- eg:df.take([1,3,4,2,5])
可以借助np.random.permutation()函數隨機排序
np.random.permutation(x)可以生成x個從0-(x-1)的隨機數列
np.random.permutation(3)
=====
array([2, 0, 1])
# 先對行進行排序,再對列驚醒排序 df.take(np.random.permutation(3),axis=1).take(np.random.permutation(1000),axis=0)[0:10]
隨機抽樣
當DataFrame規模足夠大時,直接使用np.random.permutation(x)函數,就配合take()函數實現隨機抽樣
5. 數據分類處理【重點】
數據聚合是數據處理的最后一步,通常是要使每一個數組生成一個單一的數值。
數據分類處理:
- 分組:先把數據分為幾組
- 用函數處理:為不同組的數據應用不同的函數以轉換數據
- 合並:把不同組得到的結果合並起來
數據分類處理的核心:
- groupby()函數
- groups屬性查看分組情況
- eg: df.groupby(by='item').groups
分組
from pandas import DataFrame,Series df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'], 'price':[4,3,3,2.5,4,2], 'color':['red','yellow','yellow','green','green','green'], 'weight':[12,20,50,30,20,44]}) ======= color item price weight 0 red Apple 4.0 12 1 yellow Banana 3.0 20 2 yellow Orange 3.0 50 3 green Banana 2.5 30 4 green Orange 4.0 20 5 green Apple 2.0 44
使用groupby實現分組
df.groupby(by='item',axis=0) ====== <pandas.core.groupby.DataFrameGroupBy object at 0x0000022047A91160>
使用groups查看分組情況
#該函數可以進行數據的分組,但是不顯示分組情況 df.groupby(by='item',axis=0).groups ========== {'Apple': Int64Index([0, 5], dtype='int64'), 'Banana': Int64Index([1, 3], dtype='int64'), 'Orange': Int64Index([2, 4], dtype='int64')}
分組后的聚合操作:分組后的成員中可以被進行運算的值會進行運算,不能被運算的值不進行運算
#給df創建一個新列,內容為各個水果的平均價格 df.groupby(by='item',axis=0).mean()['price'] ============== item Apple 3.00 Banana 2.75 Orange 3.50 Name: price, dtype: float64
s = df.groupby(by='item',axis=0)['price'].mean() s.to_dict() =============== {'Apple': 3.0, 'Banana': 2.75, 'Orange': 3.5}
df['item'].map(s.to_dict()) df['mean_price'] = df['item'].map(s.to_dict()) =============== color item price weight mean_price 0 red Apple 4.0 12 3.00 1 yellow Banana 3.0 20 2.75 2 yellow Orange 3.0 50 3.50 3 green Banana 2.5 30 2.75 4 green Orange 4.0 20 3.50 5 green Apple 2.0 44 3.00
按顏色查看各種顏色的水果的平均價格
s = df.groupby(by='color',axis=0)['price'].mean() dic = s.to_dict() ============== color item price weight mean_price color_mean_price 0 red Apple 4.0 12 3.00 4.000000 1 yellow Banana 3.0 20 2.75 3.000000 2 yellow Orange 3.0 50 3.50 3.000000 3 green Banana 2.5 30 2.75 2.833333 4 green Orange 4.0 20 3.50 2.833333 5 green Apple 2.0 44 3.00 2.833333
6.0 高級數據聚合¶
使用groupby分組后,也可以使用transform和apply(運算工具)提供自定義函數實現更多的運算
- df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
- transform和apply都會進行運算,在transform或者apply中傳入函數即可
- transform和apply也可以傳入一個lambda表達式
def myMean(s):#必須要有一個參數 sum = 0 for i in s: sum += i return sum/len(s) df.groupby(by='item')['price'].apply(myMean)#apply返回值是沒有經過映射的
================
item Apple 3.00 Banana 2.75 Orange 3.50 Name: price, dtype: float64
df.groupby(by='item')['price'].transform(myMean) #transform返回值是經過映射的
=================
0 3.00 1 2.75 2 3.50 3 2.75 4 3.50 5 3.00 Name: price, dtype: float64