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ù)
(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():傳入要分割的名稱荣茫,返回一個(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)