1. 程式人生 > >利用Python處理Excel資料

利用Python處理Excel資料

https://blog.csdn.net/liuyq859/article/details/78387600

  • 讀取資料
  • 顯示資料
    • 顯示資料的行與列數
    • 檢視資料格式dtpyes
    • 顯示列名
    • 新增預設的列名
    • 顯示資料後5行
    • 顯示資料唯一值
    • 跳過檔案的第i行不讀取
    • 對缺失值進行識別
  • 資料清洗
    • 處理空值
    • 更改資料格式
    • 更改列名稱
    • 刪除重複值
    • 對列表內的值進行替換
  • 資料預處理
    • 對資料進行排序
    • 資料分組
    • 資料分列
  • 資料提取
    • 按標籤提取
    • 按位置提取
    • 按標籤和位置提取
    • 按條件提取
    • 從合併的數值中提取出指定的數值
  • 資料篩選
    • 按條件篩選
  • 資料彙總
    • 分類彙總
    • 資料透視
  • 資料統計
    • 資料取樣
    • 描述統計
    • 協方差
    • 相關性分析

讀取資料

 
  1. import pandas as pd

  2. import numpy as np

  3. import matplotlib.pyplot as plt

  4. from datetime import datetime

  5. from pandas import Series, DataFrame

讀取x.xlsx檔案

EXCEL檔案

  • 方法1.
    1. 引入xlrd模組
      import xlrd
    2. 讀取資料
      df = xlrd.open_workbook('x.xlsx')
  • 方法2
    1. 利用pandas模組
      import  pandas as pd
    2. 讀取資料
      df = pd.read_excel('x.xlsx')
      本文利用方法2

顯示資料

  • 顯示資料的行與列數

    df.shape

    (24247, 17)
    有24247行,17列資料

  • 檢視資料格式dtpyes

    df.dtypes

    資料格式

  • 對檔案進行描述

image.png

  • 顯示列名
    df.columns

    列名

  • 如果資料沒有標題行,可用pandas新增預設的列名
     
    1. df = pd.read_excel('x.xlsx', header = None)

    2. #顯示前資料前5行

    3. df.head(5)

    新增預設列名

    本資料有列名,所以不用新增
  • 顯示資料後5行

    df.tail(5)

    資料後5行

  • 顯示資料唯一值(unique函式)

    df['經紀人級別'].unique()

經紀人級別

級別為0 是因為對資料缺失值進行了填充

  • 不讀取哪裡資料,可用skiprows=[i],跳過檔案的第i行不讀取

     
    1. # 沒有讀取經紀人編號為20124403的行

    2. df = pd.read_excel('x.xlsx',skiprows=[2] )

    3. df.head()

    不讀取第二行

  • 對缺失值進行識別

     
    1. # 所有缺失值顯示為True

    2. # df.isnull()

    3. pd.insull(df)

    顯示缺失值

資料清洗

  • 處理空值
    刪除空值 (dropna函式)

    df.dropna(how='any')

    刪除空值

    刪除空值

    填充空值(fillna函式)

     
    1. # 空值用0填充

    2. df.fillna(value=0)

填充空值


用均值對空值進行填充

 
  1. # 利用經紀人響應時長的均值對缺失值進行填充

  2. df['經紀人響應時長'].fillna(df['經紀人響應時長'].mean())

填充均值

  • 更改資料格式

    通過dtypes函式顯示大區的資料格式為int64,現在改成float格式

    df['大區'].astype('float64')

float64

  • 更改列名稱

    df.rename(columns={'IM渠道': '渠道'})

    更改列名稱

  • 刪除重複值 (drop_duplicates()函式)
    第一次出現的保留,其餘刪除

     
    1. #使用預設第一次出現的被保留,後面出現的被刪除

    2. df['門店'].drop_duplicates()

第一次出現保留

最後一次出現的保留,其餘刪除

df['門店'].drop_duplicates(keep = 'last')

最後一次出現的保留

  • 對列表內的值進行替換(replace函式)
    df['客戶UCID'].replace('10531975', '110')

    替換

資料預處理

  • 對資料進行排序

    df.sort_values(by=['客戶當天傳送訊息數'])

    排序

  • 資料分組——excel中的資料透視表
    ** 對客戶聊天記錄進行分組

     
    1. #如果price列的值>3000,group列顯示high,否則顯示low

    2. df['group'] = np.where(df['客戶當天傳送訊息數'] > 5,'high','low')

    3. df

分組

對符合多個條件進行分組

 
  1. # 符合經紀人級別為A1且經紀人響應時長>24的在sign列顯示為1

  2. df.loc[(df['經紀人級別'] == 'A1') & (df['經紀人響應時長']>= 24.0), 'sign']=1

  3. df

符合多個條件

  • 資料分列
     
    1. pd.DataFrame((x.split('網') for x in df['客戶註冊渠道']),

    2. index=df.index,columns=['客戶註冊渠道','size'])

    分列

資料提取

  • 按標籤提取
    • loc函式
      df.loc[0:3]

      提取0-3行的資料

    • 按日期進行提取
       
      1. # 重新設定索引

      2. df.reset_index()

      3. #設定日期為索引

      4. df=df.set_index('日期')

      5. #提取2016年11月2號的資料

      6. df[‘2016-11-2’ : '2016-11-02']

      11月2號的資料

  • 按位置進行提取(iloc函式)
    • 按區域提取
      df.iloc[:4, :5]

      4行5列

    • 按位置提取
       
      1. #[0, 2, 5] 代表指定的行,[ 4, 5 ] 代表指定的列

      2. df.iloc[[0,2,5],[4,5]]

image.png

  • 按標籤和位置提取 ix
     
    1. # 行按日期排列,列按位置設定

    2. df.ix['2016-11-03':'2016-11-03',4:6]

標籤和位置

  • 按條件提取(loc與isin函式)

    • 用isin函式進行判斷
       
      1. # 判斷經紀人級別是否為A3

      2. df['經紀人級別'].isin(['A3'])

      判斷

      • 先判斷結果,將結果為True的提取
         
        1. #先判斷經紀人級別列裡是否包含A3和M4,然後將複合條件的資料提取出來。

        2. df.loc[df['經紀人級別'].isin(['A3','M4'])]

        提取

  • 從合併的資料中提出指定的數值

     
    1. # 提取鏈家網三個字

    2. data = df['客戶註冊渠道']

    3. pd.DataFrame(data.str[:3])

提取指定數值

資料篩選

  • 按條件篩選

    • 符合多個條件,並顯示指定條件(與)
       
      1. #級別為M4,傳送訊息數大於110

      2. df.loc[(df['經紀人當天傳送訊息數'] > 110) & (df['經紀人級別'] == 'M4'),

      3. ['經紀人響應時長','是否5分鐘內響應','經紀人系統號']]

      級別為M4,傳送訊息大於110

    • 符合多個條件中的一個
       
      1. #傳送訊息數大於400或響應時長大於60000

      2. df.loc[(df['經紀人當天傳送訊息數'] > 400) | (df['經紀人響應時長'] > 60000.0),

      3. ['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長'])

       
      1. #篩選完可直接求和

      2. df.loc[(df['經紀人當天傳送訊息數'] > 400) | (df['經紀人響應時長'] > 60000.0),

      3. ['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長']).經紀人響應時長.sum()

      686046.0
      • 不等於
         
        1. df.loc[(df['經紀人當天傳送訊息數']!= 200) & (df['經紀人級別'] == 'A4'),

        2. ['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長'])

         
        1. # count() 算總數

        2. df.loc[(df['經紀人當天傳送訊息數']!= 200) & (df['經紀人級別'] == 'A4'),

        3. ['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長']).經紀人系統號.count()

        927
  • 使用query函式

    df.query('經紀人級別 == ["A4", "M4"]')

    A4或M4

資料彙總

  • 分類彙總groupby
    • 對所有列進行分類彙總
      df.groupby('經紀人級別').count()

      經紀人級別

    • 對特定列進行彙總
      df.groupby('經紀人級別')['經紀人響應時長'].count()

      對響應時長列進行彙總

    • 增加分類條件
      df.groupby(['經紀人級別','經紀人是否回覆'])['經紀人響應時長'].count()

      資料不準確,因為進行了篩選填充

    • 進行分組並進行算數運算
       
      1. # 對經紀人響應時長進行分類彙總,並計算均值

      2. df.groupby('經紀人級別')['經紀人響應時長'].agg([ np.mean])

      分類,均值

  • 資料透視
     
    1. pd.pivot_table(df,index=["經紀人當天傳送訊息數"],values=["經紀人響應時長"],

    2. columns=["經紀人級別"],aggfunc[len,np.sum],fill_value=0,margins=True)

    資料透視

資料統計

  • 資料取樣
    • 簡單隨機抽取sample
      df.sample(n=3)

      隨機抽取3行

    • 設定取樣權重
      需要對每一行進行權重設定,列表行數少可行,過多不可行
      假設有4行資料,設定取樣權重
       
      1. weights = [0, 0, 0.5, 0.5]

      2. df.sample(n=4, weights=weights)

    • 確定取樣後是否放回
       
      1. # 取樣後放回,True

      2. df.sample(n=6, replace=True)

  • 描述統計 describe函式
    自動生成資料的數量,均值,標準差等資料

     
    1. #round(2),顯示小數點後面2位數,T轉置

    2. df.describe().round(2).T

    描述統計

    • 標準差std()
      df['經紀人響應時長'].std()
      5605.0826439555485
  • 協方差cov

     
    1. #計算兩個欄位之間的協方差

    2. df['經紀人當天傳送訊息數'].cov(df['客戶當天傳送訊息數'])

    81.036975520713398

  • 相關性分析corr
    相關係數在-1到1之間,接近1為正相關,接近-1為負相關,0為不相關

    df['客戶當天傳送訊息數'].corr(df['經紀人當天傳送訊息數'])

    0.73482229334669258



作者:鬼宇書生
連結:http://www.jianshu.com/p/356a579062aa
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處