數據分析 五 pandas數據處理 刪除重復行 映射


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

 

2. 映射

 

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()
  • 清洗異常值
    • 異常值判定的條件
    • 異常值對應的行數據進行刪除

4. 排序

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM