利用Python處理Excel資料
https://blog.csdn.net/liuyq859/article/details/78387600
- 讀取資料
- 顯示資料
- 顯示資料的行與列數
- 檢視資料格式dtpyes
- 顯示列名
- 新增預設的列名
- 顯示資料後5行
- 顯示資料唯一值
- 跳過檔案的第i行不讀取
- 對缺失值進行識別
- 資料清洗
- 處理空值
- 更改資料格式
- 更改列名稱
- 刪除重複值
- 對列表內的值進行替換
- 資料預處理
- 對資料進行排序
- 資料分組
- 資料分列
- 資料提取
- 按標籤提取
- 按位置提取
- 按標籤和位置提取
- 按條件提取
- 從合併的數值中提取出指定的數值
- 資料篩選
- 按條件篩選
- 資料彙總
- 分類彙總
- 資料透視
- 資料統計
- 資料取樣
- 描述統計
- 協方差
- 相關性分析
讀取資料
-
import pandas as pd
-
import numpy as np
-
import matplotlib.pyplot as plt
-
from datetime import datetime
-
from pandas import Series, DataFrame
讀取x.xlsx檔案
EXCEL檔案
- 方法1.
- 引入xlrd模組
import xlrd
- 讀取資料
df = xlrd.open_workbook('x.xlsx')
- 引入xlrd模組
- 方法2
- 利用pandas模組
import pandas as pd
- 讀取資料
本文利用方法2df = pd.read_excel('x.xlsx')
- 利用pandas模組
顯示資料
-
顯示資料的行與列數
df.shape
(24247, 17)
有24247行,17列資料 -
檢視資料格式dtpyes
df.dtypes
資料格式
- 對檔案進行描述
image.png
- 顯示列名
df.columns
列名
- 如果資料沒有標題行,可用pandas新增預設的列名
-
df = pd.read_excel('x.xlsx', header = None)
-
#顯示前資料前5行
-
df.head(5)
新增預設列名
本資料有列名,所以不用新增
-
-
顯示資料後5行
df.tail(5)
資料後5行
-
顯示資料唯一值(unique函式)
df['經紀人級別'].unique()
經紀人級別
級別為0 是因為對資料缺失值進行了填充
-
不讀取哪裡資料,可用skiprows=[i],跳過檔案的第i行不讀取
-
# 沒有讀取經紀人編號為20124403的行
-
df = pd.read_excel('x.xlsx',skiprows=[2] )
-
df.head()
不讀取第二行
-
-
對缺失值進行識別
-
# 所有缺失值顯示為True
-
# df.isnull()
-
pd.insull(df)
顯示缺失值
-
資料清洗
-
處理空值
刪除空值 (dropna函式)df.dropna(how='any')
刪除空值
刪除空值
填充空值(fillna函式)
-
# 空值用0填充
-
df.fillna(value=0)
-
填充空值
用均值對空值進行填充
-
# 利用經紀人響應時長的均值對缺失值進行填充
-
df['經紀人響應時長'].fillna(df['經紀人響應時長'].mean())
填充均值
-
更改資料格式
通過dtypes函式顯示大區的資料格式為int64,現在改成float格式
df['大區'].astype('float64')
float64
-
更改列名稱
df.rename(columns={'IM渠道': '渠道'})
更改列名稱
-
刪除重複值 (drop_duplicates()函式)
第一次出現的保留,其餘刪除-
#使用預設第一次出現的被保留,後面出現的被刪除
-
df['門店'].drop_duplicates()
-
第一次出現保留
最後一次出現的保留,其餘刪除
df['門店'].drop_duplicates(keep = 'last')
最後一次出現的保留
- 對列表內的值進行替換(replace函式)
df['客戶UCID'].replace('10531975', '110')
替換
資料預處理
-
對資料進行排序
df.sort_values(by=['客戶當天傳送訊息數'])
排序
-
資料分組——excel中的資料透視表
** 對客戶聊天記錄進行分組-
#如果price列的值>3000,group列顯示high,否則顯示low
-
df['group'] = np.where(df['客戶當天傳送訊息數'] > 5,'high','low')
-
df
-
分組
對符合多個條件進行分組
-
# 符合經紀人級別為A1且經紀人響應時長>24的在sign列顯示為1
-
df.loc[(df['經紀人級別'] == 'A1') & (df['經紀人響應時長']>= 24.0), 'sign']=1
-
df
符合多個條件
- 資料分列
-
pd.DataFrame((x.split('網') for x in df['客戶註冊渠道']),
-
index=df.index,columns=['客戶註冊渠道','size'])
分列
-
資料提取
- 按標籤提取
- loc函式
df.loc[0:3]
提取0-3行的資料
- 按日期進行提取
-
# 重新設定索引
-
df.reset_index()
-
#設定日期為索引
-
df=df.set_index('日期')
-
#提取2016年11月2號的資料
-
df[‘2016-11-2’ : '2016-11-02']
11月2號的資料
-
- loc函式
- 按位置進行提取(iloc函式)
- 按區域提取
df.iloc[:4, :5]
4行5列
- 按位置提取
-
#[0, 2, 5] 代表指定的行,[ 4, 5 ] 代表指定的列
-
df.iloc[[0,2,5],[4,5]]
-
- 按區域提取
image.png
- 按標籤和位置提取 ix
-
# 行按日期排列,列按位置設定
-
df.ix['2016-11-03':'2016-11-03',4:6]
-
標籤和位置
-
按條件提取(loc與isin函式)
- 用isin函式進行判斷
-
# 判斷經紀人級別是否為A3
-
df['經紀人級別'].isin(['A3'])
判斷
- 先判斷結果,將結果為True的提取
-
#先判斷經紀人級別列裡是否包含A3和M4,然後將複合條件的資料提取出來。
-
df.loc[df['經紀人級別'].isin(['A3','M4'])]
提取
-
-
- 用isin函式進行判斷
-
從合併的資料中提出指定的數值
-
# 提取鏈家網三個字
-
data = df['客戶註冊渠道']
-
pd.DataFrame(data.str[:3])
-
提取指定數值
資料篩選
-
按條件篩選
- 符合多個條件,並顯示指定條件(與)
-
#級別為M4,傳送訊息數大於110
-
df.loc[(df['經紀人當天傳送訊息數'] > 110) & (df['經紀人級別'] == 'M4'),
-
['經紀人響應時長','是否5分鐘內響應','經紀人系統號']]
級別為M4,傳送訊息大於110
-
- 符合多個條件中的一個
-
#傳送訊息數大於400或響應時長大於60000
-
df.loc[(df['經紀人當天傳送訊息數'] > 400) | (df['經紀人響應時長'] > 60000.0),
-
['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長'])
或
-
#篩選完可直接求和
-
df.loc[(df['經紀人當天傳送訊息數'] > 400) | (df['經紀人響應時長'] > 60000.0),
-
['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長']).經紀人響應時長.sum()
- 不等於
-
df.loc[(df['經紀人當天傳送訊息數']!= 200) & (df['經紀人級別'] == 'A4'),
-
['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長'])
非
-
# count() 算總數
-
df.loc[(df['經紀人當天傳送訊息數']!= 200) & (df['經紀人級別'] == 'A4'),
-
['經紀人響應時長','經紀人系統號']].sort(['經紀人響應時長']).經紀人系統號.count()
-
-
- 符合多個條件,並顯示指定條件(與)
-
使用query函式
df.query('經紀人級別 == ["A4", "M4"]')
A4或M4
資料彙總
- 分類彙總groupby
- 對所有列進行分類彙總
df.groupby('經紀人級別').count()
經紀人級別
- 對特定列進行彙總
df.groupby('經紀人級別')['經紀人響應時長'].count()
對響應時長列進行彙總
- 增加分類條件
df.groupby(['經紀人級別','經紀人是否回覆'])['經紀人響應時長'].count()
資料不準確,因為進行了篩選填充
- 進行分組並進行算數運算
-
# 對經紀人響應時長進行分類彙總,並計算均值
-
df.groupby('經紀人級別')['經紀人響應時長'].agg([ np.mean])
分類,均值
-
- 對所有列進行分類彙總
- 資料透視
-
pd.pivot_table(df,index=["經紀人當天傳送訊息數"],values=["經紀人響應時長"],
-
columns=["經紀人級別"],aggfunc[len,np.sum],fill_value=0,margins=True)
資料透視
-
資料統計
- 資料取樣
- 簡單隨機抽取sample
df.sample(n=3)
隨機抽取3行
- 設定取樣權重
需要對每一行進行權重設定,列表行數少可行,過多不可行
假設有4行資料,設定取樣權重-
weights = [0, 0, 0.5, 0.5]
-
df.sample(n=4, weights=weights)
-
- 確定取樣後是否放回
-
# 取樣後放回,True
-
df.sample(n=6, replace=True)
-
- 簡單隨機抽取sample
-
描述統計 describe函式
自動生成資料的數量,均值,標準差等資料-
#round(2),顯示小數點後面2位數,T轉置
-
df.describe().round(2).T
描述統計
- 標準差std()
5605.0826439555485df['經紀人響應時長'].std()
-
-
協方差cov
-
#計算兩個欄位之間的協方差
-
df['經紀人當天傳送訊息數'].cov(df['客戶當天傳送訊息數'])
81.036975520713398
-
-
相關性分析corr
相關係數在-1到1之間,接近1為正相關,接近-1為負相關,0為不相關df['客戶當天傳送訊息數'].corr(df['經紀人當天傳送訊息數'])
0.73482229334669258
作者:鬼宇書生
連結:http://www.jianshu.com/p/356a579062aa
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處