數據分析 --- 03.數據清洗, 拼接,替換, 映射,排序,分類

一.數據清洗

- 清洗空值
- 清洗重複值
- 清洗異常值


數據的導入與導出:參考博客:
https://www.cnblogs.com/dev-liu/p/pandas_2.html

 

  1.清洗空值

有兩種丟失數據:
  None
  None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。
  np.nan(NaN)
  np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。

 

  ①.pandas中的None與NaNhtml

pandas中None與np.nan都視做np.nan

建立含空值的數據python

from pandas import Series,DataFrame
import pandas as pd
import numpy as np
df = DataFrame(data=np.random.randint(0,100,size=(10,8)))
df.iloc[1,3] = None
df.iloc[3,5] = np.nan
df.iloc[6,2] = None
df.iloc[8,5] = np.nan
df

 

  ② 刪除整行記錄數組

  第一種經過判斷app

 

 

 

  第二種 經過裝飾好的內置函數dom

df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列

 

 

  ③填充數據函數

fillna():value和method參數

value : 直接寫要填充的值

method: ffill :之前面爲基礎填充
     bfill: 之後面爲基礎填充

axis: 0 : 列
    1 : 行

 

  2.清洗重複值

   ①建立有重複的數據工具

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

df = DataFrame(data=np.random.randint(0,100,size=(8,5)))

df.iloc[2] = [6,6,6,6,6]
df.iloc[4] = [6,6,6,6,6]
df.iloc[6] = [6,6,6,6,6]
dfui

 

   ② 使用duplicated 進行去重spa

參數:
     keep: 
      first:保留第一個 last: 保留最後一個

 

 

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

drop_duplicates(keep='first/last'/False)

 

 

  3.清洗異常值

   ①建立數據

df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])

 

要求:

  對df應用篩選條件,去除標準差太大的數據:假設過濾條件爲 C列數據大於兩倍的C列標準差
std_2 = df['C'].std() * 2
std_2

#
0.5888958710508151
 
# 取反

~(df['C'] > std_2)

 

 

最終:

df.loc[~(df['C'] > std_2)]

 

 二. pandas的拼接操做

  1.級聯(表的拼接)

pd.concat,

參數:
    objs
    axis=  0 :列
      1 :行    keys    join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配),
            而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯    ignore_index=False

pd.append

 

 

  ①建立數據

import numpy as np
from pandas import DataFrame,Series
import pandas as pd
df1 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','D'],columns=['a','b','c','d'])
df2 = DataFrame(data=np.random.randint(0,100,size=(4,4)),index=['A','B','C','E'],columns=['a','b','c','e'])

 

  ②匹配的級聯

 

   ③不匹配的級聯

不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致

有2種鏈接方式:

  外鏈接:補NaN(默認模式)
  內鏈接:只鏈接匹配的項

 

  2.合併(數據的拼接)

 

使用pd.merge()合併
merge與concat的區別在於,merge須要依據某一共同的列來進行合併

使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。

注意每一列元素的順序不要求一致

參數:
  how:outer取並集 不存在時用 NaN補充, inner取交集, left:以左側爲準, right:以右側爲準
  on:當有多列相同的時候,能夠使用on來指定使用那一列進行合併,on的值爲一個列表

 

  ①一對一合併

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                'group':['Accounting','Engineering','Engineering'],
                })
df2 = DataFrame({'employee':['Lisa','Bob','Jake'],
                'hire_date':[2004,2008,2012],
                })

 

 

 

   ②多對一合併

df3 = DataFrame({
    'employee':['Lisa','Jake'],
    'group':['Accounting','Engineering'],
    'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                       'supervisor':['Carly','Guido','Steve']
                })

 

 

 

   ③多對多合併

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                 'group':['Accounting','Engineering','Engineering']})
df5 = DataFrame({'group':['Engineering','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })

 

 

 

 

   ④ key的標準化

第一種:

當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名

 

 

 

第二種:

當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列

 

 

 

   ⑤內合併和外合併

 

 

 

 三.替換 (replace)

  1.單值替換

普通替換: 替換全部符合要求的元素:to_replace=15,value='e'
按列指定單值替換: to_replace={列標籤:替換值}

 

 

 

  2.多值替換

 

 

 四. 映射(map)

 

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

eg:map({to_replace:value})

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

 

 

 

map當作一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數)
#超過3000部分的錢繳納50%的稅
def after_sal(s):
    return s - (s - 3000)*0.5

 

 

五.排序(隨機抽樣)

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

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

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

    
df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000))
df.take(axis=1,indices=np.random.permutation(3)).take(axis=0,indices=np.random.permutation(1000))[0:100]

 

 

 

 六. 數據分類處理(重點)

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

數據分類處理:

 - 分組:先把數據分爲幾組
 - 用函數處理:爲不一樣組的數據應用不一樣的函數以轉換數據
 - 合併:把不一樣組獲得的結果合併起來
 
數據分類處理的核心:
     - 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]})
df

 

 

 

 

 

七.高級數據聚合

 

使用groupby分組後,也能夠使用transform和apply提供自定義函數實現更多的運算
  df.groupby(
'item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)   transform和apply都會進行運算,在transform或者apply中傳入函數便可   transform和apply也能夠傳入一個lambda表達式

 

# 函數

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

 

  1. apply

 

 

  2. transform(能夠直接合並,更加方便)

 

 

八.案例:

  1. 美國各州人口數據分析

需求:
  導入文件,查看原始數據
  將人口數據和各州簡稱數據進行合併
  將合併的數據中重複的abbreviation列進行刪除
  查看存在缺失數據的列
  找到有哪些state/region使得state的值爲NaN,進行去重操做
  爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN
  合併各州面積數據areas
  咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行
  去除含有缺失數據的行
  找出2010年的全民人口數據
  計算各州的人口密度
  排序,並找出人口密度最高的五個州 df.sort_values()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   2.美國2012年總統候選人政治獻金數據分析

 

 1.讀取文件usa_election.txt
 
 2.查看文件樣式及基本信息
 
 3.【知識點】使用map函數+字典,新建一列各個候選人所在黨派party
 
 4.使用np.unique()函數查看colums:party這一列中有哪些元素
 
 5.使用value_counts()函數,統計party列中各個元素出現次數,value_counts()是Series中的,無參,返回一個帶有每一個元素出現次數的Series
 
 6.【知識點】使用groupby()函數,查看各個黨派收到的政治獻金總數contb_receipt_amt
 
 7.查看具體天天各個黨派收到的政治獻金總數contb_receipt_amt 。使用groupby([多個分組參數])
 
 8. 將表中日期格式轉換爲'yyyy-mm-dd'。日期格式,經過函數加map方式進行轉換
 
 9.獲得天天各政黨所收政治獻金數目。  考察知識點:groupby(多個字段)
 
 10.【知識點】使用unstack()將上面所得數據中的party行索引變成列索引
 
 11.查看老兵(捐獻者職業)DISABLED VETERAN主要支持誰  :查看老兵們捐贈給誰的錢最多
 
 12.把索引變成列,Series變量.reset_index()
 
 13.找出各個候選人的捐贈者中,捐贈金額最大的人的職業以及捐獻額  .經過query("查詢條件來查找捐獻人職業")

 

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

 

months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6,
          'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12}
of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 
               'Paul, Ron', 'Gingrich, Newt']
parties = {
  'Bachmann, Michelle': 'Republican',
  'Romney, Mitt': 'Republican',
  'Obama, Barack': 'Democrat',
  "Roemer, Charles E. 'Buddy' III": 'Reform',
  'Pawlenty, Timothy': 'Republican',
  'Johnson, Gary Earl': 'Libertarian',
  'Paul, Ron': 'Republican',
  'Santorum, Rick': 'Republican',
  'Cain, Herman': 'Republican',
  'Gingrich, Newt': 'Republican',
  'McCotter, Thaddeus G': 'Republican',
  'Huntsman, Jon': 'Republican',
  'Perry, Rick': 'Republican'           
 }

 

讀取數據

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章
相關標籤/搜索