Pandas系列接下來的文章會(huì)為大家整理一下實(shí)際使用中比較高頻的一些用法,當(dāng)然還會(huì)有一篇關(guān)于時(shí)間序列處理的文章。在這里需要強(qiáng)調(diào)一點(diǎn)就是,不建議初學(xué)者上來就把Pandas中所有的方法都啃一遍,這樣效率太低而且很多方法平時(shí)基本用不到,啃下來也容易忘。正確的方式是先把常用的方法先吃透,然后找個(gè)項(xiàng)目直接上手,遇到現(xiàn)有方法處理不了的再查看官方文檔。
通過”人工智能“的方式,我從官方文檔中篩選出一些比較常用的方法,有二十多個(gè),初學(xué)者可以先試著把這些吃透了。為了避免過多看不下去,這篇文章就先介紹10個(gè)。
用于演示的數(shù)據(jù)如下:
In [15]: data
Out[15]:
company salary age
0 NaN 43 21
1 A 8 41
2 A 28 26
3 C 42 28
4 A 33 26
5 C 20 18
6 A 48 43
7 B 25 23
8 B 39 18
.head( )
作用對(duì)象:Series和DataFrame
主要用途:返回DataFrame的前N行。當(dāng)數(shù)據(jù)量較大時(shí),使用.head()可以快速對(duì)數(shù)據(jù)有個(gè)大致了解。
用法:
#默認(rèn)返回前5行,N可以自行設(shè)定
In [16]: data.head()
Out[16]:
company salary age
0 NaN 43 21
1 A 8 41
2 A 28 26
3 C 42 28
4 A 33 26
.info( )
作用對(duì)象:Series和DataFrame
主要用途:打印所用數(shù)據(jù)的一些基本信息,包括索引和列的數(shù)據(jù)類型和占用的內(nèi)存大小。
用法:
In [17]: data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 3 columns):
company 8 non-null object
salary 9 non-null int32
age 9 non-null int32
dtypes: int32(2), object(1)
memory usage: 224.0+ bytes
.describe( )
作用對(duì)象:Series和DataFrame
主要用途:生成描述性統(tǒng)計(jì)匯總,包括數(shù)據(jù)的計(jì)數(shù)和百分位數(shù),有助于了解大致的數(shù)據(jù)分布
用法:
# 默認(rèn)生成數(shù)值列的描述性統(tǒng)計(jì)
# 使用 include = 'all'生成所有列
In [18]: data.describe()
Out[18]:
salary age
count 9.000000 9.000000
mean 31.777778 27.111111
std 12.804079 9.143911
min 8.000000 18.000000
25% 25.000000 21.000000
50% 33.000000 26.000000
75% 42.000000 28.000000
max 48.000000 43.000000
.value_counts( )
作用對(duì)象:Series
主要用途:統(tǒng)計(jì)分類變量中每個(gè)類的數(shù)量,比如company中各個(gè)公司都有多少人
主要參數(shù):
normalize (boolean, default False)
返回各類的占比
sort (boolean, default True)
是否對(duì)統(tǒng)計(jì)結(jié)果進(jìn)行排序
ascending (boolean, default False)
是否升序排列
用法:
In [19]: data['company'].value_counts()
Out[19]:
A 4
B 2
C 2
Name: company, dtype: int64
# 返回占比情況
In [20]: data['company'].value_counts(normalize=True)
Out[20]:
A 0.50
B 0.25
C 0.25
Name: company, dtype: float64
# 升序排列
In [21]: data['company'].value_counts(ascending=True)
Out[21]:
C 2
B 2
A 4
Name: company, dtype: int64
.isna( )
作用對(duì)象:Series和DataFrame
主要用途:判斷數(shù)據(jù)是否為缺失值,是的話返回True,否的話返回False
用法:
In [22]: data.isna()
Out[22]:
company salary age
0 True False False
1 False False False
2 False False False
3 False False False
4 False False False
5 False False False
6 False False False
7 False False False
8 False False False
.any( )
作用對(duì)象:Series和DataFrame
主要用途:大多數(shù)情況下數(shù)據(jù)量較大,不可能直接isna()后一個(gè)一個(gè)看是否是缺失值。any()和isna()結(jié)合使用可以判斷某一列是否有缺失值。
用法:
In [23]: data.isna().any()
Out[23]:
company True
salary False
age False
dtype: bool
.dropna( )
作用對(duì)象:Series和DataFrame
主要用途:刪掉含有缺失值的數(shù)據(jù)
用法:
In [24]: data.dropna()
Out[24]:
company salary age
1 A 8 41
2 A 28 26
3 C 42 28
4 A 33 26
5 C 20 18
6 A 48 43
7 B 25 23
8 B 39 18
.fillna( )
作用對(duì)象:Series和DataFrame
主要用途:填充缺失數(shù)據(jù)
主要參數(shù):
value (scalar, dict, Series, or DataFrame)
用于填充缺失值的值
method ({‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None)
缺失值的填充方式,常用的是bfill后面的值進(jìn)行填充,ffill用前面的值進(jìn)行填充
inplace (boolean, default False)
是否作用于原對(duì)象
用法:
In [26]: data.fillna('B')
Out[26]:
company salary age
0 B 43 21
1 A 8 41
2 A 28 26
3 C 42 28
4 A 33 26
5 C 20 18
6 A 48 43
7 B 25 23
8 B 39 18
# 用缺失值后面的值來填充(這里NaN后面是'A')
In [25]: data.fillna(method='bfill')
Out[25]:
company salary age
0 A 43 21
1 A 8 41
2 A 28 26
3 C 42 28
4 A 33 26
5 C 20 18
6 A 48 43
7 B 25 23
8 B 39 18
.sort_index( )
作用對(duì)象:Series和DataFrame
主要用途:對(duì)數(shù)據(jù)按照索引進(jìn)行排序
主要參數(shù):
ascending (boolean, default False)
是否升序排列
inplace (boolean, default False)
是否作用于原對(duì)象
用法:
# 按索引降序排列
In [27]: data.sort_index(ascending=False)
Out[27]:
company salary age
8 B 39 18
7 B 25 23
6 A 48 43
5 C 20 18
4 A 33 26
3 C 42 28
2 A 28 26
1 A 8 41
0 NaN 43 21
.sort_values( )
作用對(duì)象:Series和DataFrame
主要用途:對(duì)DataFrame而言,按照某列進(jìn)行排序(用by參數(shù)控制),對(duì)Series按數(shù)據(jù)列進(jìn)行排序。
主要參數(shù):
by (str or list of str)
作用于DataFrame時(shí)需要指定排序的列
ascending (boolean, default False)
是否升序排列
In [28]: data.sort_values(by='salary')
Out[28]:
company salary age
1 A 8 41
5 C 20 18
7 B 25 23
2 A 28 26
4 A 33 26
8 B 39 18
3 C 42 28
0 NaN 43 21
6 A 48 43
.astype()
作用對(duì)象:Series和DataFrame
主要用途:修改字段的數(shù)據(jù)類型,數(shù)據(jù)量大的情況下可用于減小數(shù)據(jù)占用的內(nèi)存,多用于Series。
用法:
# 把a(bǔ)ge字段轉(zhuǎn)為int類型
In [12]: data["age"] = data["age"].astype(int)
In [13]: data
Out[13]:
company gender salary age
0 B female 30 40
1 A female 36 31
2 B female 35 28
3 B female 9 18
4 B female 16 43
5 A male 46 22
6 B female 15 28
7 B female 33 40
8 C male 19 32
.rename()
作用對(duì)象:Series,DataFrame(大多數(shù)情況下)
主要用途:多用于修改DataFrame的列名
主要參數(shù):
columns (dict-like or function)
指定要修改的列名以及新的列名,一般以字典形式傳入
inplace (boolean, default False)
是否作用于原對(duì)象
用法:
# 將'age'更改為員工編號(hào)'number',并作用于原對(duì)象
In [15]: data.rename(columns={'age':'number'},inplace=True)
In [16]: data
Out[16]:
company gender salary number
0 B female 30 40
1 A female 36 31
2 B female 35 28
3 B female 9 18
4 B female 16 43
5 A male 46 22
6 B female 15 28
7 B female 33 40
8 C male 19 32
.set_index()
作用對(duì)象:DataFrame
主要用途:將DataFrame中的某一(多)個(gè)字段設(shè)置為索引
用法:
In [19]: data.set_index('number',inplace=True)
In [20]: data
Out[20]:
company gender salary
number
40 B female 30
31 A female 36
28 B female 35
18 B female 9
43 B female 16
22 A male 46
28 B female 15
40 B female 33
32 C male 19
.reset_index()
作用對(duì)象:Series,DataFrame
主要用途:重置索引,默認(rèn)重置后的索引為0~len(df)-1
主要參數(shù):
drop (boolean, default False)
是否丟棄原索引,具體看下方演示
inplace (boolean, default False)
是否作用于原對(duì)象
用法:
# drop = True,重置索引,并把原有的索引丟棄
In [22]: data.reset_index(drop=True)
Out[22]:
company gender salary
0 B female 30
1 A female 36
2 B female 35
3 B female 9
4 B female 16
5 A male 46
6 B female 15
7 B female 33
8 C male 19
# drop = False,重置索引
# 原索引列'number'作為新字段進(jìn)入DataFrame
In [23]: data.reset_index(drop=False,inplace=True)
In [24]: data
Out[24]:
number company gender salary
0 40 B female 30
1 31 A female 36
2 28 B female 35
3 18 B female 9
4 43 B female 16
5 22 A male 46
6 28 B female 15
7 40 B female 33
8 32 C male 19
.drop_duplicates()
作用對(duì)象:Series,DataFrame
主要用途:去掉重復(fù)值,作用和SQL中的distinct類似
用法:
In [26]: data['company'].drop_duplicates()
Out[26]:
0 B
1 A
8 C
Name: company, dtype: object
.drop()
作用對(duì)象:Series,DataFrame
主要用途:常用于刪掉DataFrame中的某些字段
主要參數(shù):
columns (single label or list-like)
指定要?jiǎng)h掉的字段
用法:
# 刪掉'gender'列
In [27]: data.drop(columns = ['gender'])
Out[27]:
number company salary
0 40 B 30
1 31 A 36
2 28 B 35
3 18 B 9
4 43 B 16
5 22 A 46
6 28 B 15
7 40 B 33
8 32 C 19
.isin()
作用對(duì)象:Series,DataFrame
主要用途:常用于構(gòu)建布爾索引,對(duì)DataFrame的數(shù)據(jù)進(jìn)行條件篩選
用法:
# 篩選出A公司和C公司的員工記錄
In [29]: data.loc[data['company'].isin(['A','C'])]
Out[29]:
number company gender salary
1 31 A female 36
5 22 A male 46
8 32 C male 19
pd.cut()
主要用途:將連續(xù)變量離散化,比如將人的年齡劃分為各個(gè)區(qū)間
主要參數(shù):
x (array-like)
需要進(jìn)行離散化的一維數(shù)據(jù)
bins (int, sequence of scalars, or IntervalIndex)
設(shè)置需要分成的區(qū)間,可以指定區(qū)間數(shù)量,也可以指定間斷點(diǎn)
labels (array or bool, optional)
設(shè)置區(qū)間的標(biāo)簽
用法:
# 把薪水分成5個(gè)區(qū)間
In [33]: pd.cut(data.salary,bins = 5)
Out[33]:
0 (23.8, 31.2]
1 (31.2, 38.6]
2 (31.2, 38.6]
3 (8.963, 16.4]
4 (8.963, 16.4]
5 (38.6, 46.0]
6 (8.963, 16.4]
7 (31.2, 38.6]
8 (16.4, 23.8]
Name: salary, dtype: category
Categories (5, interval[float64]): [(8.963, 16.4] < (16.4, 23.8] < (23.8, 31.2] < (31.2, 38.6] <(38.6, 46.0]]
# 自行指定間斷點(diǎn)
In [32]: pd.cut(data.salary,bins = [0,10,20,30,40,50])
Out[32]:
0 (20, 30]
1 (30, 40]
2 (30, 40]
3 (0, 10]
4 (10, 20]
5 (40, 50]
6 (10, 20]
7 (30, 40]
8 (10, 20]
Name: salary, dtype: category
Categories (5, interval[int64]): [(0, 10] < (10, 20] < (20, 30] < (30, 40] < (40, 50]]
# 指定區(qū)間的標(biāo)簽
In [34]: pd.cut(data.salary,bins = [0,10,20,30,40,50],labels = ['低','中下','中','中上','高'])
Out[34]:
0 中
1 中上
2 中上
3 低
4 中下
5 高
6 中下
7 中上
8 中下
Name: salary, dtype: category
Categories (5, object): [低 < 中下 < 中 < 中上 < 高]
pd.qcut()
主要用途:將連續(xù)變量離散化,區(qū)別于pd.cut()用具體數(shù)值劃分,pd.qcut()使用分位數(shù)進(jìn)行區(qū)間劃分
主要參數(shù):
x (array-like)
需要進(jìn)行離散化的一維數(shù)據(jù)
q(integer or array of quantiles)
設(shè)置需要分成的區(qū)間,可以指定區(qū)間格式,也可以指定間斷點(diǎn)
labels (array or boolean, default None)
設(shè)置區(qū)間的標(biāo)簽
用法:
# 按照0-33.33%,33.33%-66.67%,66.67%-100%百分位進(jìn)行劃分
In [35]: pd.qcut(data.salary,q = 3)
Out[35]:
0 (18.0, 33.667]
1 (33.667, 46.0]
2 (33.667, 46.0]
3 (8.999, 18.0]
4 (8.999, 18.0]
5 (33.667, 46.0]
6 (8.999, 18.0]
7 (18.0, 33.667]
8 (18.0, 33.667]
Name: salary, dtype: category
Categories (3, interval[float64]): [(8.999, 18.0] < (18.0, 33.667] < (33.667, 46.0]]
.where()
作用對(duì)象:Series,DataFrame
主要用途:將不符合條件的值替換掉成指定值,相當(dāng)于執(zhí)行了一個(gè)if-else
主要參數(shù):
cond (boolean Series/DataFrame, array-like, or callable)
用于篩選的條件
other(scalar, Series/DataFrame, or callable)
對(duì)不符合cond條件的值(結(jié)果為為False),用other的值進(jìn)行替代
用法:
# 語句解析
# 若salary<=40,則保持原來的值不變
# 若salary大于40,則設(shè)置為40
In [38]: data['salary'].where(data.salary<=40,40)
Out[38]:
0 30
1 36
2 35
3 9
4 16
5 40
6 15
7 33
8 19
Name: salary, dtype: int32
pd.concat()
主要用途:將多個(gè)Series或DataFrame拼起來(橫拼或者豎拼都可以)
主要參數(shù):
objs (a sequence or mapping of Series or DataFrame objects)
用于拼接的Series或DataFrame,一般都放在一個(gè)列表中傳入
axis (0/’index’, 1/’columns’)
控制數(shù)據(jù)是橫向拼接還是縱向拼接,默認(rèn)為縱向拼接。
ignore_index (bool, default False)
是否保留原Seires或DataFrame內(nèi)部的索引,如果為True則對(duì)拼接而成的數(shù)據(jù)生成新索引(0~n-1)
用法:
# 分別取data的前三條和后三條為data1和data2
In [41]: data1 = data.head(3)
In [42]: data1
Out[42]:
number company gender salary
0 40 B female 30
1 31 A female 36
2 28 B female 35
In [43]: data2 = data.tail(3)
In [44]: data2
Out[44]:
number company gender salary
6 28 B female 15
7 40 B female 33
8 32 C male 19
# 拼接數(shù)據(jù)
In [45]: pd.concat([data1,data2],ignore_index = False)
Out[45]:
number company gender salary
0 40 B female 30
1 31 A female 36
2 28 B female 35
6 28 B female 15
7 40 B female 33
8 32 C male 19
# 拼接數(shù)據(jù)并重置索引
In [46]: pd.concat([data1,data2],ignore_index=True)
Out[46]:
number company gender salary
0 40 B female 30
1 31 A female 36
2 28 B female 35
3 28 B female 15
4 40 B female 33
5 32 C male 19
.pivot_table()
作用對(duì)象:DataFrame
主要用途:對(duì)DataFrame進(jìn)行數(shù)據(jù)透視,相當(dāng)于Excel中的數(shù)據(jù)透視表
主要參數(shù):
values (column to aggregate, optional)
用于聚合運(yùn)算的字段(數(shù)據(jù)透視的目標(biāo)變量)
index (column, Grouper, array, or list of the previous)
類比于數(shù)據(jù)透視表中的行標(biāo)簽
columns (column, Grouper, array, or list of the previous)
類比于數(shù)據(jù)透視表中的列標(biāo)簽
aggfunc ( function, list of functions, dict, default numpy.mean)
對(duì)values進(jìn)行什么聚合運(yùn)算
用法:
# 從公司和性別兩個(gè)維度對(duì)薪水進(jìn)行數(shù)據(jù)透視
# 看看這兩個(gè)維度下的平均薪資水平
In [47]: data.pivot_table(values = 'salary',index = 'company',
columns = 'gender',aggfunc=np.mean)
Out[47]:
gender female male
company
A 36.0 46.0
B 23.0 NaN
C NaN 19.0
Pandas中常用的函數(shù)便整理到這里,至于map和apply這類的就不在此過多介紹了,詳細(xì)的介紹可以看之前寫過的文章。希望整理的這些函數(shù)能對(duì)大家有所幫助!