哈嘍,大家好,今天我講給大家介紹 Python 中非常重要的一個庫:Pandas,
Pandas 是一個基于 Numpy 的強大工具集,用于資料處理、分析、挖掘和可視化,
所有技術細節,我已整理一張 Pandas 知識結構的思維導圖,文末有獲取方式,
下面我們用 10 個小節來學習 Pandas,程序簡潔,思路清楚,喜歡本文,點贊、收藏、關注,
廢話不多說,我們開始吧!
1. 資料結構
Pandas中有兩種資料結構Series和DataFrame,
Series用一維陣列,可以存盤不同型別的資料,
>>> import pandas as pd
>>> import numpy as np
>>> pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
a 0.881931
b -0.112222
c 0.470156
d 0.394478
e 0.704801
dtype: float64
pd.Series()函式用來創建Series物件,
第一個引數是存盤的資料,這里是 Numpy 隨機生成的一維陣列,
第二個引數index是資料對應的索引,在 Python list或 Numpy 中陣列的索引都是數字,也稱為下標,但在 Pandas 中索引可以是任意型別,
DataFrame是二維結構,類似 Excel 或資料庫中的表,
>>> d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
>>> df = pd.DataFrame(d)
>>> df
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
pd.DataFrame()函式用來創建DataFrame物件,
這里用字典d創建DataFrame物件,d中的兩個鍵值對作為DataFrame兩列,鍵作為列名,值是Series物件作為列值,
創建Series和DataFrame物件的方式還有很多

Pandas資料結構
在 Pandas 中用DataFrame的頻率更高,下面的介紹以DataFrame為主,
2. 查看資料
上面創建的DataFrame只有幾條資料,一眼就看完了,如果資料量比較大,就需要借助一些函式來查看,
通過屬性查看DataFrame基本情況,如:index、columns和shape
>>> df.index
Index(['a', 'b', 'c', 'd'], dtype='object')
通過head()和tail()函式查看DataFrame明細資料
>>> df.head(2)
one two
a 1.0 1.0
b 2.0 2.0
通過describe()查看DataFrame每列統計摘要
>>> df.describe()
one two
count 3.0 4.000000
mean 2.0 2.500000
std 1.0 1.290994
min 1.0 1.000000
25% 1.5 1.750000
50% 2.0 2.500000
75% 2.5 3.250000
max 3.0 4.000000

查看資料
3. 索引
索引在 Pandas 中非常重要,通過索引我們可以獲取 Series 或 DataFrame中的任意資料,
Pandas的既有行索引,也有列索引,
3.1 索引的創建與轉化
索引除了創建Series 或 DataFrame時指定,也可以單獨創建,
>>> index = pd.Index(['e', 'd', 'a', 'b'])
>>> columns = pd.Index(['A', 'B', 'C'], name='cols')
>>> df = pd.DataFrame(np.random.randn(4, 3), index=index, columns=columns)
>>> df
cols A B C
e -0.037910 -1.032842 -1.658740
d -0.784543 0.649506 0.928499
a 0.901721 0.022041 -0.515617
b -0.443420 -0.246031 -0.803685
通過pd.Index分別創建行列索引index和columns,并用于創建 DateFrame,

3.2 索引排序
用sort_index函式對上面的df行索引排序
>>> df.sort_index(axis=0)
cols A B C
a 2.180095 -1.820624 0.046273
b -0.607010 -0.123721 1.375773
d -0.057358 -1.403620 0.462811
e -1.672218 1.299837 0.055571
Pandas 函式里經常會見到 axis 引數,用來指定行索引或列索引
-
axis=0 等價于 axis=‘index’
-
axis=1 等價于 axis=‘columns’
axis=0 表示行索引或者行索引對應的列值,因此,axis=0表示處理每列資料,同樣地,axis=1表示處理每行資料,
3.3 用索引訪問資料
通過[]形式直接獲取某列或某行
>>> # 訪問A列,等價于 df.A
>>> df['A']
e -1.672218
d -0.057358
a 2.180095
b -0.607010
>>> df[:1] # 切片訪問第一行
cols A B C
e -1.672218 1.299837 0.055571
通過標簽選擇器.loc和.at,可按照索引名訪問資料,iloc獲取切片,.at獲取標量,
>>> df
cols A B C
e -1.672218 1.299837 0.055571
d -0.057358 -1.403620 0.462811
a 2.180095 -1.820624 0.046273
b -0.607010 -0.123721 1.375773
>>> #獲取a b兩行, A B兩列資料
>>> df.loc[['a', 'b'], ['A', 'B']]
cols A B
a 2.180095 -1.820624
b -0.607010 -0.123721
>>> #獲取a行, A列元素
>>> df.at['a', 'A']
2.180094959110999
通過位置選擇器.iloc和.iat,可按照索引位置訪問資料,
之前 Pandas 還可以通過ix和reindex函式訪問資料,現在都不推薦使用了,
還可以通過布爾索引篩選滿足條件的資料
>>> #獲取A列大于0的行
>>> df[df.A > 0]
cols A B C
a 2.180095 -1.820624 0.046273
初次學習布爾索引可能會覺得難以理解,這里來拆解一下,幫助大家理解,
第一步,看df.A > 0的回傳值
mask = df.A > 0
mask
>>> mask
e False
d False
a True
b False
Name: A, dtype: bool
df.A > 0回傳的是Series一維陣列,索引跟df一樣,取值bool型別,
第二步,將mask應用在df上
>>> df[mask]
cols A B C
a 2.180095 -1.820624 0.046273
因為mask是bool型別,True表示保留該行索引,False表示丟棄該行索引,這里只有索引e取值為True,所以只保留e行,
布爾索引中通過|、&、~連接不同的判斷條件,分別代表與、或、非,

基礎訪問方式
3.4 其他函式
Pandas 中還定義了很多有用的函式,可以靈活地訪問、獲取資料,如:isin()、where()、query(),

其他函式
3.5 多級索引
之前我們接觸的DataFrame行列索引只有一層,Pandas 還支持多級(多層)索引,
多層索引并不難理解,將單層索引的某個值替換成元組,就是多層索引,用法上二者有相似之處,
3.5.1 索引創建與獲取
一般我們可以通過pd.MultiIndex創建多級索引
>>> # 通過元組串列創建2級行索引
>>> index = pd.MultiIndex.from_tuples([('bar', 'one'),('bar', 'two'),('baz', 'one'),('baz', 'two')], names=['first', 'second'])
>>> df = pd.DataFrame(np.random.randn(4, 2), index=index)
>>> df
0 1
first second
bar one 0.813204 0.817983
two -0.304902 0.396040
baz one -0.634707 0.665182
two 0.246232 -0.609914

多級索引創建與獲取
3.5.2 多級索引訪問
同樣可以通過[]、.loc等方式訪問多級索引,
>>> df
0 1
first second
bar one 0.813204 0.817983
two -0.304902 0.396040
baz one -0.634707 0.665182
two 0.246232 -0.609914
>>> # 獲取從('bar', 'one')到('bar', 'two')的行,0列
>>> df.loc[('bar','one'):('bar', 'two'), 0]
first second
bar one 0.813204
two -0.304902
Name: 0, dtype: float64
>>> # 獲取第0層行索引,bar到baz之間所有行
>>> df.loc[(slice('bar', 'baz'), slice(None)), :]
0 1
first second
bar one 0.813204 0.817983
two -0.304902 0.396040
baz one -0.634707 0.665182
two 0.246232 -0.609914

多級索引訪問
3.5.3 其他函式

4 遍歷
除了上面的訪問方式,Pandas 還支持遍歷的方式訪問 Series 或 DataFrame中的資料,
4.1 回圈方式
可以使用for回圈遍歷DataFrame每行、每列,
df.iterrows()函式可遍歷行,df.items()函式可遍歷列
>>> df[:2]
0 1
first second
bar one 0.813204 0.817983
two -0.304902 0.396040
>>> for index, row in df[:2].iterrows():
... print(index)
... print(row)
...
('bar', 'one')
0 0.813204
1 0.817983
Name: (bar, one), dtype: float64
('bar', 'two')
0 -0.304902
1 0.396040
Name: (bar, two), dtype: float64
4.2 函式方式
df.apply()函式遍歷行或列,并接收函式作為引數,用來對行、列處理,
df.applymap() 函式遍歷所有元素,接收函式作為引數,用來處理處理,

遍歷
5 運算
只能獲取資料還不夠,我們還需能對資料做計算,
5.1 二元運算
可以用運演算法,也可以用函式對DataFrame做四則運算,
以加法為例
>>> df
a b
0 1 3
1 2 4
>>> df2
a b
0 5 7
1 6 8
>>> # df + 1,等價于 df.add(1)
>>> df + 1
a b
0 2 4
1 3 5
>>> # df + df2,等價于 df.add(df2)
>>> df+df2
a b
0 6 10
1 8 12
這里的運算回傳新的DataFrame,而不會改變df中的值,
另外,Pandas 還支持反向運演算法,如:df.rdiv(df2) 等價于 df2 / df,

二元運算
5.2 計算工具
Pandas 還提供了很多好用的計算工具,幫助我們快速完成計算,
以df.cov()函式為例,呼叫該函式,可以回傳列與列之間的協方差,
>>> df.cov()
a b
a 0.5 0.5
b 0.5 0.5

計算工具
6 分組統計
分組統計是 Pandas 資料分析最常用的功能,
6.1 分組統計
Pandas 可以對 DataFrame按照行、按列、行+列的方式分組,
>>> df
a b
0 a1 1
1 a2 2
2 a1 3
>>> # 按a列分組
>>> df.groupby('a')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fafbe6f4a30>
>>> # 按第0層行索引分組
>>> df.groupby(level=0)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fafbe6f49a0>
>>> # 按第0層行索引和a列,分組計數
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fafbe70bac0>

分組方式
6.2 分組遍歷
分完組后,我們可以獲取單個分組結果,或者遍歷所有分組,
>>> for name, group in df.groupby('a'):
... print(group)
... print(name)
...
a b
0 a1 1
2 a1 3
a1
a b
1 a2 2
a2
name是a列取值,group是每個分組DataFrame,

分組遍歷
6.3 分組聚合
分組的最終目的就是為了對每個分組的資料做聚合統計,
Pandas 提供了一些內置的聚合函式,下面列舉一些常見的

同時,也支持 Numpy 的聚合函式和自定義聚合函式,
可以指定1個聚合函式,也可以指定多個聚合函式,甚至還可以對不同列指定不同的聚合函式,
>>> df
a b c
0 a1 1 4
1 a2 2 5
2 a1 3 6
>>> # 對a列分組求和
>>> df.groupby("a").sum()
b c
a
a1 4 10
a2 2 5
>>> # 對a列分組,對b c列求和、求均值
>>> df.groupby("a").agg([np.sum, np.mean])
b c
sum mean sum mean
a
a1 4 2.0 10 5.0
a2 2 2.0 5 5.0
>>> # 對a列分組,b列求和,c列用自定函式求方差
>>> df.groupby("a").agg({"b": np.sum, "c": lambda x: np.std(x, ddof=1)})
b c
a
a1 4 1.414214
a2 2 NaN

分組聚合
7. 重塑和透視
之前無論對DataFrame做什么操作,都不會改變它的結構,這部分我們會改變DataFrame的形狀,即:改變現有的行列結構,
pd.stack()將列索引變成行索引,

stack
pd.unstack()是pd.stack()的反向操作

unstack
pd.melt(),保留某幾列,將剩下的列“融化”掉,生成兩個新列,一個存放被“融化”的列名,另一個存放被“融化”的列值,

pd.pivot()類似 Excel 中的透視表,任意指定新的行列值,

pd.pivot_table()提供了透視表的聚合功能,

重塑和透視
8. 合并
Pandas 提供了一些函式,可以將多個DataFrame合并,既可以按行和并也可以按列合并,
這些函式的功能類似 SQL 中的union和join,
以pd.concat()為例,按列合并
pd.concat([df1, df2, df3])

按行和并
pd.concat([df1, df4], axis=1)


9. 可視化
Pandas 集成了 Matplotlib ,可以幫助我們快速作圖,
ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD"))
df = df.cumsum()
plt.figure()
df.plot()

折線圖

可是化
10. 特殊資料型別
Padans 對某些特殊資料型別提供一些函式,方便資料處理,
對字串型別的資料,提供字串分割、拼接、提取等函式,
對缺失值,提供填充、插值和洗掉等函式
對日期型別,提供日期加減、日期間隔等函式,

特殊資料型別
至此,我們通過 10 個小節把 Pandas 常用的功能講完了,完整的思維導圖可以如下方式獲取,
下載方式
我把這20個模板 已打包,放置后臺,獲取方法如下:
- 方法1、微信搜索公眾號:Python學習與資料挖掘,后臺回復:pandas
- 方法2、掃描二維碼或者發送圖片到微信識別,后臺回復:pandas

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398592.html
標籤:AI
上一篇:R語言進行dataframe資料左連接(Left join):使用R原生方法、data.table、dplyr等方案
