Pandas數(shù)據(jù)處理——盤點(diǎn)那些常用的函數(shù)

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ì)大家有所幫助!

學(xué)習(xí)來源1

學(xué)習(xí)來源2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容