Pandas

Pandas

目錄
一硝枉、Pandas基礎(chǔ)
二抹估、Pandas三大數(shù)據(jù)結(jié)構(gòu)
1.Series
2.DataFrame
3.Index
三缠黍、數(shù)據(jù)取值與選擇
四、數(shù)值運(yùn)算
五药蜻、缺失值處理
六瓷式、層級(jí)索引
七、合并數(shù)據(jù)集:Concat與Append操作
八语泽、合并數(shù)據(jù)集:合并與連接
九贸典、累計(jì)與分組
十、數(shù)據(jù)透視表
十一踱卵、向量化字符串操作
十二廊驼、時(shí)間序列處理
十三、高性能

一惋砂、Pandas基礎(chǔ)

1.安裝

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas

2.庫(kù)導(dǎo)入

import numpy as np
import pandas as pd

二妒挎、Pandas三大數(shù)據(jù)結(jié)構(gòu)

1.Series

(1)Series是通用的NumPy數(shù)組

Series對(duì)象和NumPy數(shù)組的差異:NumPy數(shù)組通過(guò)隱式定義的整數(shù)索引獲取數(shù)值,而Pandas的Series對(duì)象使用一種顯式定義的索引與數(shù)值相關(guān)聯(lián)班利。

data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])

(2)Series是特殊的字典

population_dict = {'California': 38332521, 
                   'Texas': 26448193, 
                   'New York': 19651127, 
                   'Florida': 19552860, 
                   'Illinois': 12882135}
population = pd.Series(population_dict)

Series比字典強(qiáng)大饥漫,支持?jǐn)?shù)組形式的操作:
如:切片

population['New York': 'Illinois']

(3)創(chuàng)建Series對(duì)象

pd.Series(data, [index])
  • 1.data可以是列表或NumPy數(shù)組
pd.Series([2, 4, 6])
  • 2.data可以是一個(gè)標(biāo)量
    創(chuàng)建Series對(duì)象時(shí)會(huì)將data重復(fù)填充到每個(gè)索引上
pd.Series(5, index=[100, 200, 300])
  • 3.data可以是一個(gè)字典
pd.Series({'a':1, 'b':2, 'c':3})

2.DataFrame

樣例用例數(shù)據(jù)

population_dict = {'California': 38332521, 
                   'Texas': 26448193, 
                   'New York': 19651127, 
                   'Florida': 19552860, 
                   'Illinois': 12882135}
area_dict = {'California': 423967, 
             'Texas': 695662, 
             'New York': 141297, 
             'Florida': 170312, 
             'Illinois': 149995}
population = pd.Series(population_dict)
area = pd.Series(area_dict)
states = pd.DataFrame({'population': population, 'area': area})

(1)DataFrame是通用的NumPy數(shù)組

(2)DataFrame是特殊的字典

普通字典是一個(gè)鍵映射一個(gè)值,而DataFrame是一列映射一個(gè)Series對(duì)象罗标。


(3)創(chuàng)建DataFrame對(duì)象

  • 1.通過(guò)單個(gè)Series對(duì)象創(chuàng)建
pd.DataFrame(Series對(duì)象, columns=['索引列名稱'])

示例:

pd.DataFrame(population, columns=['population'])
  • 2.通過(guò)字典列表創(chuàng)建
data = [{'a': i, 'b': 2 * i} for i in range(3)]
pd.DataFrame(data)

如果字典中有些鍵不存在庸队,Pandas會(huì)用缺失值NaN來(lái)填充:

pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])
  • 3.通過(guò)Series對(duì)象字典創(chuàng)建
pd.DataFrame({'population': population, 'area': area})

3.Index

(1)Index是不可變數(shù)組

  • Index對(duì)象擁有與NumPy數(shù)組相似的屬性


  • Index對(duì)象的不可變特征使得多個(gè)Series和DataFrame之間進(jìn)行索引共享時(shí)更加安全


(2)Index是有序集合

三积蜻、數(shù)據(jù)取值與選擇

1.Series數(shù)據(jù)選擇方法

示例用例數(shù)據(jù):

data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])

(1)將Series看作字典

(2)將Series看作一維數(shù)組

Series具有和NumPy數(shù)組一樣的數(shù)組數(shù)據(jù)選擇功能(索引、掩碼彻消、花哨索引等)

# 將顯式索引作為切片
data['a': 'c']
# 將隱式整數(shù)索引作為切片
data[1:3]


注意:顯式索引切片結(jié)果包含最后一個(gè)索引竿拆,隱式索引切片結(jié)果不包含最后一個(gè)索引。

# 掩碼
data[(data > 0.3) & (data < 0.8)]
# 花哨索引
data[['a', 'e']]

(3)索引器(loc宾尚、iloc丙笋、ix)

示例用例數(shù)據(jù):

data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])

①loc顯式索引

②iloc隱式索引

③ix混合索引

2.DataFrame數(shù)據(jù)選擇方法

示例用例數(shù)據(jù):

area_dict = {'California': 423967, 
             'Texas': 695662, 
             'New York': 141297, 
             'Florida': 170312, 
             'Illinois': 149995}
population_dict = {'California': 38332521, 
                   'Texas': 26448193, 
                   'New York': 19651127, 
                   'Florida': 19552860, 
                   'Illinois': 12882135}
area = pd.Series(area_dict)
pop = pd.Series(population_dict)

data = pd.DataFrame({'area': area, 'pop': pop})

(1)將DataFrame看作字典

(2)將DataFrame看作二維數(shù)組

  • 使用索引器取值


  • 任何用于處理NumPy形式數(shù)據(jù)的方法,都可以用于這些索引器煌贴,如:掩碼御板、花哨索引
  • 任何一種取值方法都可以用于修改數(shù)據(jù)


    image.png

(3)其他取值方法

  • 對(duì)單個(gè)標(biāo)簽取值選擇列,對(duì)多個(gè)標(biāo)簽切片選擇行
  • 切片也可以直接使用行數(shù)實(shí)現(xiàn)(隱式索引)


  • 掩碼操作可以對(duì)每一行進(jìn)行過(guò)濾


四牛郑、數(shù)值運(yùn)算

常見(jiàn)Python運(yùn)算符與Pandas方法映射關(guān)系

Python運(yùn)算符 Pandas方法
+ add()
- sub()怠肋、subtract()
* mul()、multiply()
/ truediv()淹朋、div()笙各、divide()
// floordiv()
% mod()
** pow()

1.通用函數(shù):保留索引

通用函數(shù)運(yùn)算結(jié)果會(huì)保留索引

  • Series


  • DataFrame


2.通用函數(shù):索引對(duì)齊

(1)Series索引對(duì)齊

  • 運(yùn)算結(jié)果數(shù)組的索引是兩個(gè)數(shù)組索引的并集。
  • 對(duì)于缺失位置的數(shù)據(jù)础芍,Pandas會(huì)用NaN填充杈抢,表示“此處沒(méi)有數(shù)據(jù)”。


  • 如果NaN值不是想要的結(jié)果仑性,可以用通用函數(shù)的fill_value參數(shù)來(lái)指定惶楼。


(2)DataFrame索引對(duì)齊

  • 在計(jì)算兩個(gè)DataFrame時(shí),索引對(duì)齊規(guī)則同樣會(huì)出現(xiàn)在共同列(并集)中虏缸。


  • df.unstack()方法可以將二維數(shù)據(jù)拆為一維數(shù)據(jù)


3.通用函數(shù):DataFrame與Series的運(yùn)算

  • 二維數(shù)組減去一行會(huì)按行計(jì)算鲫懒,Pandas減去一行默認(rèn)也是按行計(jì)算嫩实。
  • 通過(guò)通用函數(shù)的axis參數(shù)刽辙,可以指定計(jì)算的方式。


  • DataFrame和Series運(yùn)算時(shí)甲献,結(jié)果的索引也會(huì)自動(dòng)對(duì)齊宰缤。


五、缺失值處理

Pandas采用標(biāo)簽值表示缺失值
有兩種方式:

1.浮點(diǎn)數(shù)據(jù)類型NaN
2.Python對(duì)象類型None

1.None:Pyhton對(duì)象類型的缺失值(object對(duì)象類型)

  • 只能用于NumPy/Pandas數(shù)組類型中的'object'類型晃洒。


  • object類型的數(shù)據(jù)會(huì)消耗更多的資源慨灭。

    注意:無(wú)法對(duì)包含None的數(shù)組進(jìn)行累計(jì)操作。

2.NaN:數(shù)值類型的缺失值(浮點(diǎn)型)

  • NaN是一種按照IEEE浮點(diǎn)數(shù)標(biāo)準(zhǔn)設(shè)計(jì)球及、在任何系統(tǒng)中都兼容的特殊浮點(diǎn)數(shù)氧骤。


  • 任何數(shù)與NaN進(jìn)行運(yùn)算結(jié)果都是NaN。


    =

3.Pandas中None與NaN的差異

  • Pandas將None與NaN看作是等價(jià)可交換的吃引,在適當(dāng)?shù)臅r(shí)候會(huì)將兩者進(jìn)行替換筹陵。
  • Pandas會(huì)將沒(méi)有標(biāo)簽值的數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換為NaN刽锤。


  • Pandas會(huì)將含缺失值的整型數(shù)組轉(zhuǎn)換為浮點(diǎn)類型,并且將None轉(zhuǎn)換為NaN朦佩。



    如果是DataFrame并思,則會(huì)將含缺失值的列轉(zhuǎn)換為浮點(diǎn)類型。

4.處理缺失值

Pandas對(duì)不同類型缺失值的轉(zhuǎn)換規(guī)則

類型 缺失值轉(zhuǎn)換規(guī)則 NA標(biāo)簽值
floating浮點(diǎn)型 無(wú)變化 np.nan
object對(duì)象類型 無(wú)變化 None或np.nan
integer整數(shù)類型 強(qiáng)制轉(zhuǎn)換為float64 np.nan
boolean布爾類型 強(qiáng)制轉(zhuǎn)換為object None或np.nan

注意:Pandas中字符串類型的數(shù)據(jù)通常使用object類型存儲(chǔ)的语稠。

(1)發(fā)現(xiàn)缺失值

isnull()方法和data.notnull()方法:創(chuàng)建一個(gè)布爾類型的掩碼標(biāo)簽

data = pd.Series([1, np.nan, 'hello', None])
data.isnull()
data.notnull()

(2)剔除缺失值

data.dropna()
  • 1.Series
    dropna()方法返回一個(gè)去除缺失值的數(shù)據(jù)宋彼。


  • 2.DataFrame
    默認(rèn)情況下剔除包含缺失值的整行數(shù)據(jù)。



    可以指定刪除含缺失值的整列數(shù)據(jù)仙畦。

df.dropna(axis=1)
df.dropna(axis='columns')
  • 3.還可以自定刪除條件
    ①通過(guò)how參數(shù)定義刪除規(guī)則
df.dropna(axis=刪除軸, how='刪除規(guī)則')

②通過(guò)thresh參數(shù)設(shè)置判定是否刪除的缺失值數(shù)量

df.dropna(axis=刪除軸, thresh=最小缺失值數(shù)量)

(3)填充缺失值

①指定值填充

data.fillna(填充值)

②前向填充

用缺失值前面的有效值來(lái)從前往后填充(forward-fill)

data.fillna(method='ffill')

③后向填充

用缺失值后面的有效值來(lái)從后往前填充(back-fill)

data.fillna(method='bfill')
  • DataFrame填充方法與Series類似输涕,只是在填充式需要設(shè)置坐標(biāo)軸參數(shù)axis。若不指定則默認(rèn)按行填充(用上一行的有效值填充下一行的缺失值)慨畸。


六占贫、層級(jí)索引

目錄
1.多級(jí)索引Series
2.多級(jí)索引的創(chuàng)建方法
3.多級(jí)索引的取值與切片
4.多級(jí)索引行列轉(zhuǎn)換
5.多級(jí)索引的數(shù)據(jù)累計(jì)方法

1.多級(jí)索引Series

示例用例數(shù)據(jù):

index = [('California', 2000), ('California', 2010), ('New York', 2000), ('New York', 2010), ('Texas', 2000), ('Texas', 2010)]
populations = [33871648, 37253956, 18976457, 19378102, 20851820, 25145561]
pop = pd.Series(populations, index=index)

(1)普通方法(使用普通索引)


缺點(diǎn):在查詢數(shù)據(jù)時(shí)需使用循環(huán)迭代,不夠簡(jiǎn)潔(在處理大量數(shù)據(jù)時(shí)效率也不高)先口。

(2)Pandas多級(jí)索引

index = [索引元組列表]
index = pd.MultiIndex.from_tuples(index)
data = data.reindex(index)

通過(guò)多級(jí)索引可以方便地查詢數(shù)據(jù):


(3)高維數(shù)據(jù)的多級(jí)索引

  • 1.unstack()方法可以將一個(gè)擁有多級(jí)索引的Series轉(zhuǎn)換為普通索引的DataFrame型奥。
  • 2.stack()方法可以將使用普通索引的DataFrame轉(zhuǎn)換為擁有多級(jí)索引的Series。
data_df = data.unstack()
data = data_df.stack()
  • 增加一列


2.多級(jí)索引的創(chuàng)建方法

  • 為Series或DataFrame創(chuàng)建多級(jí)索引最直接的辦法就是講index參數(shù)設(shè)置為至少二維的索引數(shù)組碉京。


(1)顯式地創(chuàng)建多級(jí)索引


顯式多級(jí)索引創(chuàng)建完成以后厢汹,可以通過(guò)index參數(shù)指定,或者通過(guò)reindex()方法更新Series或DataFrame的索引谐宙。

(2)多級(jí)索引的等級(jí)名稱

可以在構(gòu)造MultiIndex時(shí)通過(guò)參數(shù)names烫葬,或在構(gòu)造完成后通過(guò)MultiIndex對(duì)象的names屬性來(lái)指定索引的等級(jí)名稱。


(3)多級(jí)列索引

# 多級(jí)行列索引
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']], names=['subject', 'type'])

# 模擬數(shù)據(jù)
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37

# 創(chuàng)建DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)
health_data

3.多級(jí)索引的取值與切片

(1)Series多級(jí)索引

  • 1.如果只取最高級(jí)索引凡蜻,獲取的結(jié)果是一個(gè)新的Series,未被選中的低層索引值會(huì)被保留搭综。


  • 2.如果想要直接使用較低層級(jí)的索引取值,第一層級(jí)的索引可以用空切片划栓。


  • 3.多級(jí)索引同樣支持花哨索引兑巾、掩碼等操作


(2)DataFrame多級(jí)索引

  • 可以使用loc|iloc選擇多行多列


  • 在元組中使用切片會(huì)引起錯(cuò)誤,因此Pandas使用IndexSlice對(duì)象進(jìn)行切片操作


4.多級(jí)索引行列轉(zhuǎn)換

(1)有序索引和無(wú)序索引

多級(jí)索引局部切片要求MultiIndex的各級(jí)索引是有序的忠荞。


(2)索引stack與unstack

(3)索引的設(shè)置與重置

  • 1.使用name參數(shù)為列設(shè)置名稱(將多級(jí)索引變成多列數(shù)據(jù))


  • 2.將多列數(shù)據(jù)設(shè)置為多級(jí)索引


5.多級(jí)索引的數(shù)據(jù)累計(jì)方法

七蒋歌、合并數(shù)據(jù)集:Concat與Append操作

1.知識(shí)回顧:NumPy數(shù)組合并

2.pd.concat()方法

示例用例方法:

def make_df(cols, ind):
    data = {c:[str(c) + str(i) for i in ind] for c in cols}
    print(data)
    return pd.DataFrame(data, ind)
  • 1.Series


  • 2.DataFrame



(1)索引重復(fù)

  • 合并時(shí),pd.concat方法會(huì)保留重復(fù)的索引


處理重復(fù)索引
1.捕捉索引重復(fù)異常:設(shè)置vertify_integrity=True委煤,合并時(shí)若出現(xiàn)重復(fù)索引則觸發(fā)異常堂油。
2.忽略重復(fù)索引:設(shè)置ignore_index=True,合并時(shí)則將會(huì)創(chuàng)建一個(gè)新的整數(shù)索引碧绞。


(2)類似join的合并

示例用例數(shù)據(jù):

df5 = make_df('ABC', [1, 2])
df6 = make_df('BCD', [3, 4])
print(df5, '\n\n', df6)
pd.concat([df5, df6], sort=False)


(3)append()方法


注意:append()方法合并會(huì)創(chuàng)建新對(duì)象府框,效率較低。

八讥邻、合并數(shù)據(jù)集:合并與連接

目錄
1.數(shù)據(jù)連接的類型
2.設(shè)置數(shù)據(jù)合并的鍵
3.設(shè)置數(shù)據(jù)連接的集合操作規(guī)則
4.設(shè)置重復(fù)列名后綴名

1.數(shù)據(jù)連接的類型

pd.merge()實(shí)現(xiàn)三種類型的數(shù)據(jù)連接(一對(duì)一迫靖、一對(duì)多癣诱、多對(duì)多)

(1)一對(duì)一連接

  • pd.merge()方法會(huì)發(fā)現(xiàn)兩個(gè)DataFrame都有的列,并會(huì)自動(dòng)以這列作為鍵進(jìn)行連接袜香,生成一個(gè)新的DataFrame撕予。
df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'], 'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'], 'hire_date': [2004, 2008, 2012, 2014]})
df3 = pd.merge(df1, df2)

(2)一對(duì)多連接

一個(gè)group對(duì)應(yīng)多個(gè)employee:


(3)多對(duì)多連接

一個(gè)group對(duì)應(yīng)多個(gè)employee,一個(gè)group對(duì)應(yīng)多個(gè)skills:



2.設(shè)置數(shù)據(jù)合并的鍵

(1)on參數(shù)

  • 通過(guò)pd.merge()方法的on參數(shù)指定關(guān)聯(lián)時(shí)的鍵
pd.merge(df1, df2, on='參照鍵')


注意:on參數(shù)只能在兩個(gè)DataFrame有相同的列名時(shí)使用蜈首。

(2)left_on與right_on參數(shù)


(3)left_index與right_index參數(shù)

  • 通過(guò)索引連接
df1a = df1.set_index('employee')
df2a = df2.set_index('employee')
pd.merge(df1a, df2a, left_index=True, right_index=True)

  • join()方法也可以按照索引進(jìn)行連接


  • 可以通過(guò) left_index|right_on或者left_on|right_index參數(shù)組合实抡,將列和索引混合使用


3.設(shè)置數(shù)據(jù)連接的集合操作規(guī)則

用例數(shù)據(jù):

df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'], 'food': ['fish', 'beans', 'bread']}, columns=['name', 'food'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'], 'drink': ['wine', 'beer']}, columns=['name', 'drink'])
  • 默認(rèn)情況下pd.merge()方法采用內(nèi)連接


  • 通過(guò)merge()方法的how參數(shù)指定連接規(guī)則



4.設(shè)置重復(fù)列名后綴名

用例數(shù)據(jù):

df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [3, 1, 2, 4]})
  • 通過(guò)suffixes參數(shù)指定重復(fù)列名后綴名


九、累計(jì)與分組

1.累計(jì)

Series和DataFrame支持所有的NumPy累計(jì)操作

Pandas常見(jiàn)累計(jì)方法

指標(biāo) 描述
count() 計(jì)數(shù)項(xiàng)
first()欢策、last() 第一項(xiàng)吆寨、最后一項(xiàng)
mean()、median() 均值踩寇、中位數(shù)
min()啄清、max() 最小值、最大值
std()俺孙、var() 標(biāo)準(zhǔn)差辣卒、方差
mad() 均值絕對(duì)偏差
prod() 所有項(xiàng)乘積
sum() 所有項(xiàng)求和

示例:


  • Series和DataFrame支持所有的NumPy累計(jì)操作


  • 查看常見(jiàn)的統(tǒng)計(jì)值
df.describe()

2.分組:GroupBy

(1)GroupBy過(guò)程:分割、應(yīng)用睛榄、組合

GroupBy操作可視化過(guò)程

groupby():傳入要分割的名稱荣茫,返回一個(gè)DataFrameGroupBy對(duì)象,可以進(jìn)行進(jìn)一步操作场靴。

(2)GroupBy對(duì)象

groupby對(duì)象主要有以下四種操作:

aggregate伟葫、filter强窖、transform、apply(累計(jì)寝并、過(guò)濾宪郊、轉(zhuǎn)換软吐、應(yīng)用)

用例數(shù)據(jù):

import seaborn as sns
planets = sns.load_dataset('planets')
# 查看前五行數(shù)據(jù)
planets.head()
# 查看后五行數(shù)據(jù)
planets.tail()
# 查看數(shù)據(jù)描述信息
planets.describe()

①按列取值

②按組迭代

③調(diào)用方法

  • 調(diào)用方法可以讓任何不由GroupBy對(duì)象直接實(shí)現(xiàn)的方法直接應(yīng)用的每一組


(3)累計(jì)膘盖、過(guò)濾鞋拟、轉(zhuǎn)換、應(yīng)用

用例數(shù)據(jù):

rng = np.random.RandomState(0)
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'], 'data1': range(6), 'data2': rng.randint(0, 10, 6)}, columns=['key', 'data1', 'data2'])

①累計(jì):aggregate()方法

  • aggregate()方法支持復(fù)雜的累計(jì)操作阵谚,如:字符串蚕礼、函數(shù)、函數(shù)列表等


  • aggregate()方法可以傳入一個(gè)字典梢什,為不同的列指定不同的累計(jì)方法


②過(guò)濾:filter()方法

過(guò)濾操作:按照分組屬性,丟棄若干數(shù)據(jù)(返回True保留數(shù)據(jù)朝聋,返回False過(guò)濾掉數(shù)據(jù))嗡午。

③轉(zhuǎn)換:transform()方法

轉(zhuǎn)換:累計(jì)操作是對(duì)組內(nèi)全量數(shù)據(jù)進(jìn)行縮減的結(jié)果,而轉(zhuǎn)換操作會(huì)返回一個(gè)新的全量數(shù)據(jù)冀痕。

④應(yīng)用:apply()方法

apply()方法可以在每個(gè)組上應(yīng)用任意方法荔睹, 輸入一個(gè)DataFrame狸演,返回一個(gè)Pandas對(duì)象(Series或DataFrame)或一個(gè)標(biāo)量(scalar)。

(4)設(shè)置分割的鍵

①將列表僻他、數(shù)組宵距、Series、索引作為分組鍵

  • 分組鍵可以是長(zhǎng)度與DataFrame匹配的任意Series或列表


②用字典或Series將索引映射到分組名稱

df2 = df.set_index('key')
mapping = {'A': 'vower', 'B': 'consonant', 'C': 'consonant'}
df2.groupby(mapping).sum()


注意:索引的值要與字典的鍵保持統(tǒng)一吨拗。

③任意Python函數(shù)

  • 可以將任意Python函數(shù)傳入groupby满哪,函數(shù)映射到索引


  • 將函數(shù)作為分組鍵時(shí),會(huì)修改函數(shù)傳入索引列的值劝篷,如果沒(méi)有定義索引哨鸭,就會(huì)傳入隱式索引的值



④多個(gè)有效鍵構(gòu)成的列表

  • 只要是有效的鍵就可以組合起來(lái)進(jìn)行分組


(5)分組案例

十、數(shù)據(jù)透視表

用例數(shù)據(jù):

import seaborn as sns
titanic = sns.load_dataset('titanic')

1.手工制作數(shù)據(jù)透視表

2.數(shù)據(jù)透視表語(yǔ)法

pivot_table()方法:數(shù)據(jù)透視表

# 兩條語(yǔ)句等效
titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()
titanic.pivot_table('survived', index='sex', columns='class')

(1)多級(jí)數(shù)據(jù)透視表

  • 數(shù)據(jù)透視表中的分組可以通過(guò)各種參數(shù)指定多個(gè)等級(jí)


(2)其他數(shù)據(jù)透視表選項(xiàng)

  • 通過(guò)字典為不同列指定不同的累計(jì)函數(shù)
titanic.pivot_table(index='sex', columns='class', aggfunc={'survived': sum, 'fare': 'mean'})
  • margins_name參數(shù):用來(lái)指定總數(shù)行的名稱


十一娇妓、向量化字符串操作

1.Pandas字符串操作

Series和Index對(duì)象提供了str屬性像鸡,可以方便地實(shí)現(xiàn)對(duì)字符串的操作,并且正確地處理缺失值哈恰。


2.Pandas字符串方法列表

(1)與Python字符串方法相似的方法

幾乎所有Python內(nèi)置的字符串方法都被復(fù)制到Pandas的向量化字符串方法中只估。
注意:這些方法的返回值可能與Python內(nèi)置函數(shù)不同。
示例:

(2)正則表達(dá)式方法

Pandas向量化字符串方法與Python標(biāo)準(zhǔn)庫(kù)re模塊函數(shù)對(duì)應(yīng)關(guān)系

方法 描述
match() 對(duì)每個(gè)元素調(diào)用re.match()着绷,返回布爾類型值
extract() 對(duì)每個(gè)元素調(diào)用re.match()仅乓,返回匹配的字符串組(groups)
findall() 對(duì)每個(gè)元素調(diào)用re.findall()
replace() 用正則模式替換字符串
contains() 對(duì)每個(gè)元素調(diào)用re.search(),返回布爾類型值
count() 統(tǒng)計(jì)符合正則模式的字符串?dāng)?shù)量
split() 等價(jià)于str.split()蓬戚,支持正則表達(dá)式
rsplit() 等價(jià)于str.rsplit()夸楣,支持正則表達(dá)式

示例:



(3)其他字符串方法

方法 描述
get() 獲取元素索引位置上的值,索引從0開(kāi)始
slice() 對(duì)元素進(jìn)行切片取值
slice_replace() 對(duì)元素進(jìn)行切片替換
cat() 連接字符串(此方法功能復(fù)雜子漩,建議閱讀文檔)
repeat() 重復(fù)元素
normalize() 將字符串轉(zhuǎn)換為Unicode規(guī)范格式
pad() 在字符串的左邊豫喧、右邊或兩邊增加空格
wrap() 將字符串按照指定的寬度換行
join() 用分隔符連接Series的每個(gè)元素
get_dummies() 按照分隔符提取每個(gè)元素的dummy變量,轉(zhuǎn)換為獨(dú)熱(one-hot)編碼的DataFrame

①向量化字符串取值與切片操作

  • 切片操作


  • 取值操作


②指標(biāo)變量

# A=出生在美國(guó)
# B=出生在英國(guó)
# C=喜歡奶酪
# D=喜歡午餐肉
full_monte = pd.DataFrame({'name': monte, 'info': ['B|C|D', 'B|D', 'A|C', 'B|D', 'B|C', 'B|C|D']})
  • 獨(dú)熱編碼
# 快速將指標(biāo)變量轉(zhuǎn)換為獨(dú)熱編碼
full_monte['info'].str.get_dummies('|')

十二幢泼、時(shí)間序列處理

基本概念

  • 時(shí)間戳:表示某個(gè)具體的時(shí)間點(diǎn)
  • 時(shí)間間隔與周期:表示開(kāi)始時(shí)間點(diǎn)與結(jié)束時(shí)間點(diǎn)之間的時(shí)間長(zhǎng)度
  • 時(shí)間增量(持續(xù)時(shí)間):表示精確的時(shí)間長(zhǎng)度

1.Python日期與時(shí)間工具

(1)原生Python日期時(shí)間工具

from datetime import datetime
from dateutil import parser

(2)時(shí)間類型數(shù)組:NumPy datetime64類型

日期與時(shí)間單位格式代碼

代碼 含義
Y
M
W
D
h 時(shí)
m
s
ms 毫秒
us 微秒
ns 納秒
ps 皮秒
fs 飛秒
as 原秒

(3)Pandas日期時(shí)間工具

  • Pandas所有關(guān)于日期時(shí)間的處理方法全部都是通過(guò)TimeStamp對(duì)象實(shí)現(xiàn)的紧显。


  • 可以直接進(jìn)行NumPy類型的向量化運(yùn)算。


2.Pandas時(shí)間序列:用時(shí)間作索引

(1)Pandas時(shí)間序列數(shù)據(jù)結(jié)構(gòu)

時(shí)間戳:Timestamp類型
周期型:Period類型
時(shí)間增量(持續(xù)時(shí)間):Timedelta類型

  • 能夠解析多種多種日期時(shí)間格式


  • 當(dāng)用一個(gè)日期減去另一個(gè)日期時(shí)缕棵,返回的結(jié)果是TimedeltaIndex類型



(2)時(shí)間頻率與偏移量

Pandas頻率代碼

代碼 描述
D
W
M 月末
Q 季末
A 年末
H 小時(shí)
T 分鐘
S
L 毫秒
U 微秒
N 納秒
B 天(僅含工作日)
BM 月末(僅含工作日)
BQ 季末(僅含工作日)
BA 年末(僅含工作日)
BH 小時(shí)(工作時(shí)間)
MS 月初
BMS 月初(僅含工作日)
B- 僅含工作日
-S
  • 所有代碼都對(duì)應(yīng)有一個(gè)偏移量孵班,可以在pandas.tseries.offsets里找到
from pandas.tseries.offsets import BDay

(3)重新取樣和頻率轉(zhuǎn)換

數(shù)據(jù)讀取:

  • 1.安裝pandas-datareader
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas-datareader
  • 2.讀取數(shù)據(jù)
from pandas_datareader import data
tencent = data.get_data_yahoo('0700.hk', start='2000-11-01', end='2019-08-20')
  • 3.讀取收盤(pán)價(jià)
tencent = tencent['Close']
  • 4.畫(huà)圖
%matplotlib inline
import matplotlib.pyplot as plt
tencent.plot()

①重新取樣和頻率轉(zhuǎn)換

重新取樣

resample():數(shù)據(jù)累計(jì)
asfreq():數(shù)據(jù)選擇

tencent.plot(alpha=0.5, style='-')
# resample()方法是數(shù)據(jù)累計(jì)采樣招驴,結(jié)果為上一年的均值
tencent.resample('BA').mean().plot(style=':')
# asfreq()方法是數(shù)據(jù)選擇采樣篙程,結(jié)果為上一年最后一個(gè)工作日的收盤(pán)價(jià)
tencent.asfreq('BA').plot(style='k:')

plt.legend(['input', 'resample', 'asfreq'], loc='upper left')
fig, ax = plt.subplots(2, sharex=True)
data = tencent.iloc[: 10]

data.asfreq('D').plot(ax=ax[0], marker='o')

data.asfreq('D', method='bfill').plot(ax=ax[1], style=['-o'])
data.asfreq('D', method='ffill').plot(ax=ax[1], style=['--o'])
ax[1].legend(['back-fill', 'forward-fill'])

②時(shí)間遷移

時(shí)間遷移

shift():遷移數(shù)據(jù)
tshift():遷移索引

fig, ax = plt.subplots(3, sharey=True)
fig.subplots_adjust(hspace=0.36)

# 重新按天采樣,向后填充缺失值
tencent = tencent.asfreq('D', method='pad')

tencent.plot(ax=ax[0])
# 遷移數(shù)據(jù)
tencent.shift(900).plot(ax=ax[1])
# 遷移索引
tencent.tshift(900).plot(ax=ax[2])

# 設(shè)置圖例與標(biāo)簽
local_max = pd.to_datetime('2007-11-05')
offset = pd.Timedelta(900, 'D')

ax[0].legend(['input'], loc=2)
ax[0].get_xticklabels()[4].set(weight='heavy', color='red')
ax[0].axvline(local_max, alpha=0.3, color='red')

ax[1].legend(['input'], loc=2)
ax[1].get_xticklabels()[4].set(weight='heavy', color='red')
ax[1].axvline(local_max + offset, alpha=0.3, color='red')

ax[2].legend(['input'], loc=2)
ax[2].get_xticklabels()[1].set(weight='heavy', color='red')
ax[2].axvline(local_max + offset, alpha=0.3, color='red')

③移動(dòng)時(shí)間窗口

  • Series和DataFrame有一個(gè)rolling屬性别厘,可以實(shí)現(xiàn)計(jì)算移動(dòng)統(tǒng)計(jì)值虱饿。
rolling = tencent.rolling(365, center=True)
data = pd.DataFrame({'input': tencent, 'one-year rolling_mean': rolling.mean(), 'one-year rolling_std': rolling.std()})
ax = data.plot(style=['-', '--', ':'])
ax.lines[0].set_alpha(0.3)

十三、高性能Pandas:eval()與query()

1.pandas.eval()實(shí)現(xiàn)高性能運(yùn)算

  • pandas.eval()方法用字符串代數(shù)式實(shí)現(xiàn)了DataFrame的高性能運(yùn)算。
  • pandas.eval()在執(zhí)行時(shí)不需要為臨時(shí)數(shù)組分配全部?jī)?nèi)存氮发。

2.pandas.eval()支持的運(yùn)算

(1)算術(shù)運(yùn)算符

pd.eval()支持所有的算術(shù)運(yùn)算符

result1 = -df1 * df2 / (df3 + df4) - df1
result2 = pd.eval("-df1 * df2 / (df3 + df4) - df1")
np.allclose(result1, result2)

(2)比較運(yùn)算符

pd.eval()支持所有的比較運(yùn)算符渴肉,包括鏈?zhǔn)酱鷶?shù)式

result1 = (df1 < df2) & (df2 <= df3) & (df3 != df4)
result2 = pd.eval('df1 < df2 <= df3 != df4')
np.allclose(result1, result2)

(3)位運(yùn)算符

pd.eval()支持&(與)、|(或)等運(yùn)算符

result1 = (df1 < 0.5) & (df2 <= 0.5) & (df3 < df4)
result2 = pd.eval('(df1 < 0.5) & (df2 <= 0.5) & (df3 < df4)')
np.allclose(result1, result2)

(4)對(duì)象屬性與索引

result1 = df2.T[0] + df3.iloc[1]
result2 = pd.eval('df2.T[0] + df3.iloc[1]')
np.allclose(result1, result2)

注意:目前pd.eval()尚不支持函數(shù)調(diào)用爽冕、條件語(yǔ)句仇祭、循環(huán)及更復(fù)雜的運(yùn)算。如果需要進(jìn)行這些運(yùn)算颈畸,可以借助Numexpr來(lái)實(shí)現(xiàn)乌奇。

3.DataFrame.eval()實(shí)現(xiàn)列間運(yùn)算

df = pd.DataFrame(np.random.rand(1000, 3), columns=['A', 'B', 'C'])
result1 = (df['A'] + df['B']) / (df['C'] - 1)
result2 = pd.eval("(df.A + df.B) / (df.C - 1)")
# 更簡(jiǎn)潔的方式
result3 = df.eval("(A + B) / (C - 1)")
np.allclose(result1, result2), np.allclose(result1, result3)
  • 1.新增列


  • 2.修改列


  • 3.DataFrame.eval()使用局部變量


4.DataFrame.query()方法

Cmean = df['C'].mean()
result1 = df[(df.A < Cmean) & (df.B < Cmean)]
result2 = df.query("A < @Cmean and B < @Cmean")
np.allclose(result1, result2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市承冰,隨后出現(xiàn)的幾起案子华弓,更是在濱河造成了極大的恐慌,老刑警劉巖困乒,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂屏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡娜搂,警方通過(guò)查閱死者的電腦和手機(jī)迁霎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)百宇,“玉大人考廉,你說(shuō)我怎么就攤上這事⌒” “怎么了昌粤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)啄刹。 經(jīng)常有香客問(wèn)我涮坐,道長(zhǎng),這世上最難降的妖魔是什么誓军? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任袱讹,我火速辦了婚禮,結(jié)果婚禮上昵时,老公的妹妹穿的比我還像新娘捷雕。我一直安慰自己,他們只是感情好壹甥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布救巷。 她就那樣靜靜地躺著,像睡著了一般盹廷。 火紅的嫁衣襯著肌膚如雪征绸。 梳的紋絲不亂的頭發(fā)上久橙,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天俄占,我揣著相機(jī)與錄音管怠,去河邊找鬼。 笑死缸榄,一個(gè)胖子當(dāng)著我的面吹牛渤弛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甚带,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼她肯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鹰贵?” 一聲冷哼從身側(cè)響起晴氨,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碉输,沒(méi)想到半個(gè)月后籽前,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敷钾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年枝哄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻荒。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挠锥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侨赡,到底是詐尸還是另有隱情蓖租,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布羊壹,位于F島的核電站蓖宦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舶掖。R本人自食惡果不足惜球昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眨攘。 院中可真熱鬧主慰,春花似錦、人聲如沸鲫售。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)情竹。三九已至藐不,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雏蛮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工涎嚼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挑秉。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓法梯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親犀概。 傳聞我的和親對(duì)象是個(gè)殘疾皇子立哑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容