目錄
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 例題
df = DataFrame(data=np.random.randint(0,100,size=(8,4)))
0 1 2 3
0 52 0 19 15
1 666 666 666 666
2 55 52 66 28
3 666 666 666 666
4 81 11 49 12
5 57 80 15 4
6 666 666 666 666
7 13 13 34 87
刪除重復元素 (duplicated)
1. duplicated(): 函數檢測重復的行,返回元素為布爾類型的Series對象,每個元素對應一行,如果該行不是第一次出現,則元素為True
- keep參數:指定保留哪一重復的行數據
2. 使用duplicated查看所有重復元素行
df.duplicated(keep='first')
- first # 保留第一行重復的值
- last # 保留最后一行重復的值
- False # 不保留重復行
3. 刪除重復行
df.loc[~df.duplicated(keep=False)]
4. 使用drop()刪除重復行
indexs = df.loc[df.duplicated(keep='last')].index
df.drop(labels=indexs,axis=0)
5. 使用drop_duplicates()函數刪除重復的行
df.drop_duplicates(keep='first',inplace=False)
映射 (replace)
Series替換操作
1. replace()函數:替換元素, 使用replace()函數,對values進行映射操作
2. Series替換操作
- 單值替換
- 普通替換
- 字典替換(推薦)
- 多值替換
- 列表替換
- 字典替換(推薦)
- 參數
- to_replace: 被替換的元素
1. 單值普通替換
s = Series(data=[3,4,5,6,8,10,9])
s.replace(to_replace=[5,6],value=['five','six'], inplace=True)
2. replace參數說明:
- method: 對指定的值使用相鄰的值填充替換
- limit: 設定填充次數
DataFrame替換操作
1. DataFrame替換操作
- 單值替換
- 普通替換: 替換所有符合要求的元素: (to_replace=15,value='e')
- 按列指定單值替換: to_replace={列標簽:替換值} value='value'
- 多值替換
- 列表替換: to_replace=[] value=[]
- 字典替換(推薦) to_replace={to_replace:value,to_replace:value}
1) 將 666 替換為 six (全部替換)
df.replace(to_replace=666,value='six')
2) 將所有 0 替換為 zero, 5 替換為 five
df.replace(to_replace={0:'zero', 5:'five'})
3) 將第二列的 666 替換為 six, (當設置參數value時, 字典的鍵則為指定列)
df.replace(to_replace={2:666},value='six')
注意: DataFrame中,無法使用method和limit參數
map函數
1. map()函數:新建一列, map函數並不是df的方法, 而是series的方法
- map()可以映射新一列數據
- map()中可以使用lambd表達式
- map()中可以使用方法,可以是自定義的方法
eg:map({to_replace:value})
注意: map()中不能使用sum之類的函數,for循環
name salary
0 jay 12000
1 tom 7000
2 jay 12000
1. 新增一列:給df中,添加一列,該列的值為英文名對應的中文名
# 映射關系表
dic = {
'jay':'周傑倫',
'tom':'湯姆',
}
df['c_name'] = df['name'].map(dic)
2. map當做一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數)
1) 使用自定義函數, 超過3000部分的錢繳納50%的稅
def after_salary(s): # s 為 salary 列對應的每一個元素
if s <= 3000:
return s
else:
return s - (s-3000)*0.5 # 對每一個元素進行操作並返回
df['after_salary'] = df['salary'].map(after_salary)
注意: 並不是任何形式的函數都可以作為map的參數。只有當一個函數具有一個參數且有返回值,那么該函數才可以作為map的參數。
使用聚合操作對數據異常值檢測和過濾
1. 使用df.std()函數可以求得DataFrame對象每一列的標准差
1) 創建一個1000行3列的df 范圍(0-1),求其每一列的標准差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
std_twice = df['C'].std() * 2
df['C'] > std_twice
df.loc[~(df['C'] > std_twice)]
2) 對df應用篩選條件,去除標准差太大的數據:假設過濾條件為 C列數據大於兩倍的C列標准差
df['C'] > std_twice
df.loc[df['C'] > std_twice]
indexs = df.loc[df['C'] > std_twice].index
df.loc[indexs,'C'] = np.nan
df.fillna(axis=0,method='ffill',inplace=True)
df.fillna(axis=0,method='bfill',inplace=True)
排序
1. 使用.take()函數排序
- take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序
- eg:df.take([1,3,4,2,5])
可以借助np.random.permutation()函數隨機排序
1) 通過顯式索引對列進行排序
df.take([2,1,0],axis=1)
2) 隨機排序列
df.take(np.random.permutation(3),axis=1)
3) 隨機排序行和列
df = df.take(np.random.permutation(3),axis=1).take(np.random.permutation(1000),axis=0)
2. np.random.permutation(x)可以生成x個從0-(x-1)的隨機數列
np.random.permutation(5) # array([1, 0, 3, 4, 2])
3. 隨機抽樣
當DataFrame規模足夠大時,直接使用np.random.permutation(x)函數,就配合take()函數實現隨機抽樣
數據分類處理 (重點)
1. 數據聚合是數據處理的最后一步,通常是要使每一個數組生成一個單一的數值。
1) 數據分類處理:
- 分組:先把數據分為幾組
- 用函數處理:為不同組的數據應用不同的函數以轉換數據
- 合並:把不同組得到的結果合並起來
2) 數據分類處理的核心:
- groupby()函數
- groups屬性查看分組情況
- eg: df.groupby(by='item').groups
分組
示例數據: df
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
1. 分組
1) 使用groupby實現分組
df.groupby(by='item',axis=0) # 返回一個對象
2) 使用goups屬性查看分組情況
df.groupby(by='item',axis=0).groups
2. 分組后的聚合操作: 分組后的成員中可以被進行運算的值會進行運算,不能被運算的值不進行運算
1) 給df創建一個新列,內容為各個水果的平均價格
mean_price = df.groupby(by='item',axis=0).mean()['price']
2) 調用 to_dict() 方法, 將結果生成一個字典, 並映射在df中
dic = mean_price.to_dict() # {'Apple': 3.0, 'Banana': 2.75, 'Orange': 3.5}
df['mean_price'] = df['item'].map(dic)
3) 按顏色查看各種顏色的水果的平均價格, 映射在df中
color_mean_price = df.groupby(by='color',axis=0)['price'].mean()
dic = color_mean_price.to_dict()
df['color_mean_price'] = df['color'].map(dic)
高級數據聚合
1. 使用groupby分組后,也可以使用transform和apply提供自定義函數實現更多的運算
- df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
- transform和apply都會進行運算,在transform或者apply中傳入函數即可
- transform和apply也可以傳入一個lambda表達式
數據: df
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
1) 使用apply函數求出水果的平均價格
def fun(s):
sum = 0
for i in s:
sum+=i
return sum/s.size
df.groupby(by='item')['price'].apply(fun)
2) 使用transform函數求出水果的平均價格
df.groupby(by='item')['price'].transform(fun)
3) apply還可以代替運算工具形式map
s = Series(data=[1,2,3,4,5,6,7,87,9,9])
s.map(func) # 用於series上,是元素級別的操作
s.apply(func) # 用在dataframe上,用於對row或者column進行計算