1.Pandas數據結構
- Series :是一種相似於一維數組的對象,由一組數據以及一組與之相關的數據標籤(即索引)組成。
- DataFrame :是一個表格型的數據結構,既有行索引又有列索引的一種數據結構.
2.外部導入數據
格式 :python
pd.read_excel(r"D:\Data-Science\share\data\pandas_train.xlsx",encoding = "gbk",engine='python',sep = " ")mysql
導入SQL :sql
import pymysql
sql_cmd = "SELECT * FROM memberinfo"
db = pymysql.connect(host = "X.X.X.X",
user = "XXX",
password = "*******",
db = "XXX" ,
charset = "utf8")
# host:數據庫地址/本機使用localhost
# user:用戶名
# password:密碼
# db:數據庫名
# charset:數據庫編碼,通常爲UTF-8
#注:若是用戶名或密碼中包含特殊符號@、%等符號時,須要修改密碼方可連接
df = pd.read_sql(sql_cmd, db)
總結:數據庫
一樣數量的數據,導入excel格式是導入csv格式的10倍,因此儘可能將錶轉爲csv之後進行處理數組
3.數據熟悉
head(N) 數據結構 |
輸出前N行 , 默認5行app |
shape 函數 |
輸出(行數, 列數)測試 |
info()編碼 |
輸出表相關信息 |
describe() |
輸出數值型數據的count,中位數,min,max,mean等 |
4.數據預處理
4.1.刪除缺失值
dropna() 默認刪除含有缺失值得行
參數:
how="all" 刪除全爲缺失值的行
4.2.填充缺失值
fillna()
#fillna()和dropna()默認會返回一個替換後的新對象,不改變源數據,這個時候將替換後的數據賦值給新的表,若是要改變源數據,經過傳入inplace=True進行更改
# 以字典的形式指明要填充的列名
5.重複值處理
對於重複值咱們通常是進行刪除處理,使用的方法是drop_duplicates()
#subset表示按哪列/幾列進行去重
#keep=first表示保留保留第一個,=last表示保留最後一個,=False表示刪除全部重複值,默認是first
#inplace表示是否更改源數據
6.異常值處理
- 最經常使用的處理方式就是刪除。
- 把異常值看成缺失值來填充。
- 把異常值看成特殊狀況,研究異常值出現的緣由。
類型 |
說明 |
int |
整型數,即整數 |
float |
浮點數,即含有小數點 |
object |
python對象類型,用O表示 |
string_ |
字符串類型,常常用S表示,S10表示長度爲10的字符串 |
unicode_ |
固定長度的unicode類型,跟字符串定義方式同樣,常常用U表示 |
7 索引設置
7.1 爲無索引表設置索引
df.columns = ["技能","週數"]
df.index = ['第一', '第二', '第三', '第四']
7.2 從新設置索引
#設置單一索引
df112.set_index("用戶編號").head()
#設置層次化索引
df64=df112.set_index(["家庭成員","好壞客戶"])
7.3 重命名索引
#利用rename的方法對行/列名進行重命名
columns={"用戶編號":"用戶編號-測試",
"好壞客戶":"好壞客戶-測試"}
index={0:"zero",
1:"one"}
df112.rename(columns=columns,index=index).head()
7.4 重置索引
reset_index(level=None, drop=False, inplace=False)
level 參數用來指定要將層次化索引的第幾級別轉化爲 columns,第一個索引爲 0 級,第二個索引爲 1 級,默認爲所有索引,即默認把索引所有轉化爲 columns。
drop參數用來指定是否將原索引刪掉,即不做爲一個新的columns,默認爲False, 即不刪除原索引。
inplace 參數用來指定是否修改原數據表。
8 數據選擇
普通索引: 經過傳入列名選擇數據. (行和列有區別 , 行用到loc)
位置索引: iloc 方法
8.1 列選擇
#獲取某一列,其實就是一個Series
df["家庭成員"].head()
#獲取特定的某幾列
df[["用戶編號","年齡"]].head()
# 選擇某幾列,如第一列和第三列
df.iloc[:,[0,2]].head()
# 選擇連續的某幾列,如第一列到第三列
df.iloc[:,[0:2]].head()
8.2 行選擇
# 選擇某行/某幾行
df521.loc[["零","二"]]
#利用位置索引第一行和第三行
df521.iloc[[0,2]]
#利用位置索引第一行到第三行
df521.iloc[0:2]
8.2.1篩選知足條件的行
df112[(df112["用戶編號"]>10)|(df112["年齡"]<25)]
8.3 列行同時選擇
df[df["QADays"]<5]["GoodsID"]
df521.loc[["零","一"],["用戶編號","年齡"]]
df521.iloc[[0,1],[0,2]]
df112[df112["用戶編號"]<5][["用戶編號","年齡"]]
df521.iloc[0:2,0:3]
#交叉索引用到ix
df521.ix[0:3,["用戶編號","年齡"]]
9.數值操做
9.1 數值替換replace()
#針對全表一對一進行替換
import numpy as np
df112.replace(np.NaN,0).head()
#針對全表多對一進行替換
df112.replace([0,1],"替換值").head()
#針對全表多對多替換
df112.replace({1:"是",0:"否"}).head()
#針對某列進行替換,且不更改源數據 ,參數inplace = True/False
df112["好壞客戶"].replace({1:"是",0:"否"},inplace=False).head()
9.2數值排序sort_values()
#按某列進行升序, 默認升序即 ascending = True , 按照某一列 by=["年齡"]
#缺失值默認放在後面 , 可改成前面即: na_position="first"
df112.sort_values(by=["年齡"]).head()
#按某幾列進行升序排列
#先按第一列進行升序,若是第二列有重複值,則再按第二列進行降序
df112.sort_values(by=["用戶編號","年齡"],ascending=[True,False]).head()
9.3數值排名rank()
method |
說明 |
"average" |
這種處理方式與Excel中RANK.AVG一致 |
"first" |
按值在全部的待排列數據中出現的前後順序排名 |
"min" |
這種處理方式與Excel中RANK.EQ一致 |
"max" |
與min相對應,取重複值對應的最大排名 |
rank(ascending,method)
#默認 method = average
df["成交量"].rank()
9.4 數值刪除drop()
#刪除一列/多列
df112.drop(columns=["用戶編號","年齡"]).head()
#刪除一列/多列,對於直接傳入列名須要 傳入參數axis=1 , 而0表示刪除行
df112.drop(["用戶編號","年齡"],axis=1).head()
#一樣須要傳入inplace=True才能夠改變原始數據
#根據行索引刪除行
df112.drop([0,1],axis=0).head()
df112.drop(df112.index[[0,1]]).head()
9.5數值計數value_counts()
#各種別佔比 normalize = True
df112["好壞客戶"].value_counts(normalize = True)
9.6惟一值獲取unique()
df112["年齡"].unique()
9.7數值查找isin()
df112["好壞客戶"].isin([0,1])
9.8區間切分cut() 和 qcut()
#自定義切分
bins=[0,100,1000,10000,150000]
pd.cut(df112["用戶編號"],bins).unique()
#等量切分 如5等分
pd.qcut(df112["用戶編號"],5).unique()
9.9 插入新的行或列insert()
df112.insert(3,"插入-測試",data)#表示在第4列插入一列名爲"插入-測試"的數據data
#方法二,在最後一列後面插入一列
df112["新插入一列"] = data
9.10行列互換 T
#轉置
df12.T.T
9.11索引重塑stack()

9.12長寬錶轉換

>>df612.melt(id_vars = ["Company","Name"],
var_name = "Year",
value_name = "Sale")
-----------------------
Company Name Year Sale
0 Apple 蘋果 Sale2013 5000
1 Google 谷歌 Sale2013 3500
2 Facebook 臉書 Sale2013 2300
3 Apple 蘋果 Sale2014 5050
4 Google 谷歌 Sale2014 3800
5 Facebook 臉書 Sale2014 2900
6 Apple 蘋果 Sale2015 5050
7 Google 谷歌 Sale2015 3800
8 Facebook 臉書 Sale2015 2900
9 Apple 蘋果 Sale2016 5050
10 Google 谷歌 Sale2016 3800
11 Facebook 臉書 Sale2016 2900
id_vars 參數用於指明寬錶轉換到長表時保持不變的列,
var_name 參數示原來的列索引轉化爲「行索引」之後對應的列名,
value_name 表示新索引對應的值的列名。
9.13 apply()和applymap() 函數
df611.applymap(lambda x:x*2)
df611["C2"].apply(lambda x:x+2)

10 數據運算
10.1 算術運算
+ - * /
10.2 比較運算
< > = !=
10.3 彙總運算
函數 |
說明 |
count |
非NA值得數量 |
mean |
平均值 |
sum |
求和 |
max |
求最大值 |
min |
求最小值 |
median |
中位數 |
mode |
求衆數 |
var |
方差 |
std |
標準差 |
quantile |
求分位數 |
corr |
相關係數 |
#兩變量的相關係數
df112["年齡"].corr(df112["月收入"])
out : 0.03771565421103959
#相關係數矩陣
df112.corr()
11時間函數
11.1 datetime和time的區別
time是基於系統層面的一些操做,datetime 基於time進行了封裝,提供了更多實用的函數。
11.2 datetime
>>from datetime import datetime
>>now = datetime.now()
#時間元組
out : datetime.datetime(2019, 8, 12, 19, 57, 31, 214668)
# 年,月,日,星期
>> now.year now.month now.day now.weekday()
# 日期的年份、整年的週數、本週第幾天:(2019, 33, 1)
>> now.isocalendar()
11.3 time
>>import time
#獲取時間長格式
>>time.localtime()
out: time.struct_time(tm_year=2019, tm_mon=8, tm_mday=12, tm_hour=20, tm_min=6, tm_sec=46, tm_wday=0, tm_yday=224, tm_isdst=0)
#時間戳
>>time.time()
out: 1565611051.3792284
11.7 格式化時間
strptime()是將時間格式的時間轉化爲某些自定義的格式,具體的格式有如下:
#字符串轉爲time
s_time = '2019-01-03 08:57:21'
time.strptime(s_time,"%Y-%m-%d %H:%M:%S")
#字符串轉爲datetime
datetime.strptime(s_time,"%Y-%m-%d %H:%M:%S")
代碼 |
說明 |
%H |
小時(24小時制)[00,23] |
%I |
小時(12小時)[01,12] |
%M |
2位數的分[00,59] |
%S |
秒[00,61] |
%w |
用整數表示星期幾,從0開始 |
%U |
每一年的第幾周,週日被認爲是每週第一天 |
%W |
每一年的第幾周,週一被認爲是每週第一天 |
%F |
%Y-%m-%d的簡寫形式,例如2018-04-18 |
%D |
%m/%d/%y的簡寫形式,例如04/18/2018 |
strftime是將時間格式的時間轉化爲某些自定義的格式,具體的格式有如下:
#time轉化爲字符串
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
#datetime轉化爲字符串
datetime.now().strftime("%Y-%m-%d %H:%M:%S")
代碼 |
說明 |
%H |
小時(24小時制)[00,23] |
%I |
小時(12小時)[01,12] |
%M |
2位數的分[00,59] |
%S |
秒[00,61] |
%w |
用整數表示星期幾,從0開始 |
%U |
每一年的第幾周,週日被認爲是每週第一天 |
%W |
每一年的第幾周,週一被認爲是每週第一天 |
%F |
%Y-%m-%d的簡寫形式,例如2018-04-18 |
%D |
%m/%d/%y的簡寫形式,例如04/18/2018 |
11.4 時間索引
import pandas as pd
import numpy as np
index = pd.DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-02-06', '2018-02-07', '2018-02-08',
'2018-02-09', '2018-02-10'])
data = pd.DataFrame(np.arange(1,11),columns = ["num"],index = index)
#時間索引pandas.datatimeindex()用處
#獲取2018年的數據
data["2018"]
#獲取2018年1月1到1月3的數據
data["2018-01-01":"2018-01-03"]
11.5 日期之差

11.6 時間偏移
12 數據分組/透視
12.1 分組鍵時列名
# 分組鍵是多個列
groupby(["區域","客戶分類"])
#獲取某列的分組結果
df2.groupby(["區域","是否省會"])["7月銷量"].sum()
12.2 aggregate方法
除了常規的加減乘除計數以外,還能夠自定義函數,並經過aggregate或agg方法傳入便可。
#不一樣列作不一樣的聚合運算
df2.groupby("客戶分類").aggregate({"用戶ID":"count","7月銷量":"sum","8月銷量":"sum"})
#針對相同的列作不一樣的聚合運算
df2.groupby(["區域"])["7月銷量"].aggregate(["count","sum"])
#該函數是針對每一個分組內的數進行計算的
def zidingyi(arr):
return arr.sum()
df2.groupby(["區域","是否省會"])["7月銷量"].agg(zidingyi)
#參數: 以無索引形式返回聚合數據
as_index=False
12.3 數據透視表 pivot_table()
pd.pivot_table(data,values=["7月銷量","8月銷量"],index=["區域","客戶分類"],columns="是否省會",aggfunc="sum", fill_value=0,margins=True,margins_name="總計")
參數:
-
- 缺失值填充: fill_value 默認爲Nan
- 合計: margins 默認關閉
- 合計名: margins_name
13 多表聯結
13.1 橫向聯結(列聯結)
merge(table1,table2,...)
參數:
-
- on # 用on來指定鏈接鍵 ,默認以公共列
- how # 聯結方式 inner outer right left
- suffixes #重複列名處理
13.2 縱向聯結(行聯結)
concat()
參數:
-
- ignore_index #忽略索引
- drop_duplicates() #重置數據處理
14 結果導出
14.1 Excel單個sheet
#無窮值處理
df2.to_excel(excel_writer = r"D:\Data-Science\share\data\測試文檔.xlsx",sheet_name = "這是sheet名",index = False,columns = ["學號","班級"],encoding = "utf-8",na_rep = 0,inf_rep = 0)
參數:
-
- na_rep #缺失值處理
- inf_rep #無窮值處理
14.2 Excel多個sheet
#聲明一個讀寫對象
#excelpath爲文件要存放的路徑
excelpath = "D:/Data-Science/share/data/多文件報表.xlsx"
writer = pd.ExcelWriter(excelpath,engine = "xlsxwriter")
df1 = t2.reset_index()
df2 = t1.reset_index()
df3 = t11.reset_index()
#分別將表df一、df二、df3寫入excel中的sheet一、sheet二、sheet3
#並命名爲表一、表二、表3
df1.to_excel(writer,sheet_name = "表1")
df2.to_excel(writer,sheet_name = "表2")
df3.to_excel(writer,sheet_name = "表3")
#保存讀寫的內容
writer.sav
14.3 導出 CVS
#設置分割符,多列, 編碼, 設置索引
df2.to_csv(r"D:\Data-Science\share\data\測試.csv",index = False,columns = ["學號","班級"],encoding = "gbk",sep = ",")