pandas基礎

1.Pandas數據結構
  1. Series :是一種相似於一維數組的對象,由一組數據以及一組與之相關的數據標籤(即索引)組成。
  2. DataFrame :是一個表格型的數據結構,既有行索引又有列索引的一種數據結構.
2.外部導入數據
  • 導入xlsx
  • 導入CVS
  • 導入txt
  • 導入SQL

格式 :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 = ",")

相關文章
相關標籤/搜索