pandas 數據處理

刪除重複數據

使用duplicated()函數檢測重複的行,返回元素爲布爾類型的Series對象,每一個元素對應一行,若是該行不是第一次出現,則元素爲True 數組

keep參數:指定保留哪一重複的行數據

建立具備重複元素行的dataframe數據

import numpy as np
import pandas 
from pandas import Series,DataFrame

#建立一個df
df = DataFrame(data=np.random.randint(0,100,size=(8,4)))

#手動將df的某幾行設置成相同的內容
df.iloc[1] = [666,666,666,666]
df.iloc[3] = [666,666,666,666]
df.iloc[5] = [666,666,666,666]

使用duplicated查看全部重複元素行

df.loc[~(df.duplicated(keep='first'))] #指定保留第一行重複數據

 使用drop去除重複數據

indexs = df.loc[df.duplicated(keep='last')].index  #保留最後的元素
df.drop(labels=indexs,axis=0)

使用drop_duplicates()函數刪除重複的行

參數: drop_duplicates(keep='first/last'/False)
df.drop_duplicates(keep='first',inplace=False)

映射

 使用replace()函數,對values進行映射操做app

Series替換操做

  • 單值替換
    • 普通替換
    • 字典替換(推薦)
  • 多值替換
    • 列表替換
    • 字典替換(推薦)
  • 參數
    • to_replace:被替換的元素

單值普通替換 

s = Series(data=[2,3,4,5,6,7])

s.replace(to_replace=[5,6],value=['five','six'])

DataFrame替換操做

  • 單值替換
    • 普通替換: 替換全部符合要求的元素:to_replace=15,value='e'
    • 按列指定單值替換: to_replace={列標籤:替換值} value='value'
  • 多值替換
    • 列表替換: to_replace=[] value=[]
    • 字典替換(推薦) to_replace={to_replace:value,to_replace:value}

 

df.replace(to_replace=666,value='sixsixsix')

df.replace(to_replace={9:'nine'}) #將9替換爲nine
df.replace(to_replace={3:666},value='six') #將第三列中的666替換爲six

 map()函數

新建一列, map函數並非df的方法,而是series的方法

  • map()能夠映射新一列數據
  • map()中可使用lambd表達式
  • map()中可使用方法,能夠是自定義的方法dom

    eg:map({to_replace:value})函數

  • 注意 map()中不能使用sum之類的函數,for循環

從新建立一個df

dic = {
    'name':['jay','tom','jay'],
    'salary':[12000,7000,12000]
}
df = DataFrame(data=dic)

新增一列:給df中,添加一列,該列的值爲英文名對應的中文名

dic = {
    "jay":'周杰倫',
    "tom":'張三',
}
df['c_name'] = df['name'].map(dic)

map當作一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數

 使用自定義函數

 超過3000部分的錢繳納50%的稅

def after_salary(s):
    if s <= 3000:
        return s
    else:
        return s - (s-3000)*0.5

df['after_sal'] = df['salary'].map(after_salary)

注意:並非任何形式的函數均可以做爲map的參數。只有當一個函數具備一個參數且有返回值,那麼該函數才能夠做爲map的參數工具

 

使用聚合操做對數據異常值檢測和過濾

 使用df.std()函數能夠求得DataFrame對象每一列的標準差性能

#建立一個1000行3列的df 範圍(0-1),求其每一列的標準差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])

對df應用篩選條件,去除標準差太大的數據:假設過濾條件爲 C列數據大於兩倍的C列標準差spa

std_twice = df['C'].std() * 2
df['C']  > std_twice
df.loc[~(df['C']  > std_twice)]

填充3d

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) #後一個值填充

排序

使用.take()函數排序

- take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序
- eg:df.take([1,3,4,2,5])


df.take([2,1,0],axis=1)

 

能夠藉助np.random.permutation()函數隨機排序

df.take(np.random.permutation(3),axis=1)

 

random_df = df.take(np.random.permutation(3),axis=1).take(np.random.permutation(1000),axis=0)

 

np.random.permutation(x)能夠生成x個從0-(x-1)的隨機數列

np.random.permutation(5)

 

數據分類處理

數據聚合是數據處理的最後一步,一般是要使每個數組生成一個單一的數值。code

數據分類處理:orm

  • 分組:先把數據分爲幾組
  • 用函數處理:爲不一樣組的數據應用不一樣的函數以轉換數據
  • 合併:把不一樣組獲得的結果合併起來

數據分類處理的核心:

- 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]})

使用groupby實現分組

df.groupby(by='item',axis=0)

使用goups屬性查看分組

df.groupby(by='item',axis=0).groups

分組後的聚合操做:分組後的成員中能夠被進行運算的值會進行運算,不能被運算的值不進行運算

給df建立一個新列,內容爲各個水果的平均價格, mean():平均

mean_price = df.groupby(by='item',axis=0)['price'].mean()

#結果
    item
    Apple     3.00
    Banana    2.75
    Orange    3.50
    Name: price, dtype: float64

將數據轉化爲字典

dic = mean_price.to_dict()

結果: {'Apple': 3.0, 'Banana': 2.75, 'Orange': 3.5}

將結果添加數據中

df['mean_price'] = df['item'].map(dic)

按顏色查看各類顏色的水果的平均價格

color_mean_price = df.groupby(by='color',axis=0)['price'].mean()

高級數據聚合

使用groupby分組後,也可使用transform和apply提供自定義函數實現更多的運算

  • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都會進行運算,在transform或者apply中傳入函數便可
  • transform和apply也能夠傳入一個lambda表達式

使用apply函數求出水果的平均價格

def fun(s):
    sum = 0
    for i in s:
      sum+=i
    return sum/s.size

df.groupby(by='item')['price'].apply(fun) #性能要不map好

使用transform函數求出水果的平均價格

 def fun(s):
    sum = 0
    for i in s:
      sum+=i
    return sum/s.size

df.groupby(by='item')['price'].transform(fun)

 apply還能夠替代運算工具map,效率高不少

s = Series(data=[1,2,3,4,5,6,7,87,9,9])
# s.map(func)
s.apply(func)
相關文章
相關標籤/搜索