介紹
在Python中,pandas是基于NumPy數(shù)組構(gòu)建的,使數(shù)據(jù)預(yù)處理、清洗、分析工作變得更快更簡(jiǎn)單。pandas是專門為處理表格和混雜數(shù)據(jù)設(shè)計(jì)的,而NumPy更適合處理統(tǒng)一的數(shù)值數(shù)組數(shù)據(jù)。
使用下面格式約定,引入pandas包:
pandas有兩個(gè)主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。
Series
Series是一種類似于一維數(shù)組的對(duì)象,它由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成,即index和values兩部分,可以通過(guò)索引的方式選取Series中的單個(gè)或一組值。
Series的創(chuàng)建
pd.Series(list,index=[ ]),第二個(gè)參數(shù)是Series中數(shù)據(jù)的索引,可以省略。
- 第一個(gè)參數(shù)可以是列表\ndarray
import numpy as np, pandas as pd
arr1 = np.arange(10)
s1 = pd.Series(arr1)
print(s1) #由于我們沒(méi)有為數(shù)據(jù)指定索引,于是會(huì)自動(dòng)創(chuàng)建一個(gè)0到N-1(N為數(shù)據(jù)的長(zhǎng)度)的整數(shù)型索引
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
- 第一個(gè)參數(shù)可以是字典,字典的鍵將作為Series的索引
- 第一個(gè)參數(shù)可以是DataFrame中的某一行或某一列
Series類型的操作
Series類型索引、切片、運(yùn)算的操作類似于ndarray,同樣的類似Python字典類型的操作,包括保留字in操作、使用.get()方法。
Series和ndarray之間的主要區(qū)別在于Series之間的操作會(huì)根據(jù)索引自動(dòng)對(duì)齊數(shù)據(jù)。
DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)類型,每列值類型可以不同,是最常用的pandas對(duì)象。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個(gè)索引)。DataFrame中的數(shù)據(jù)是以一個(gè)或多個(gè)二維塊存放的(而不是列表、字典或別的一維數(shù)據(jù)結(jié)構(gòu))。
DataFrame的創(chuàng)建
pd.DataFrame(data,columns = [ ],index = [ ]):columns和index為指定的列、行索引,并按照順序排列。
- 創(chuàng)建DataFrame最常用的是直接傳入一個(gè)由等長(zhǎng)列表或NumPy數(shù)組組成的字典,會(huì)自動(dòng)加上行索引,字典的鍵會(huì)被當(dāng)做列索引:
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
df= pd.DataFrame(data)
In [45]: df
Out[45]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
5 3.2 Nevada 2003
如果創(chuàng)建時(shí)指定了columns和index索引,則按照索引順序排列,并且如果傳入的列在數(shù)據(jù)中找不到,就會(huì)在結(jié)果中產(chǎn)生缺失值:
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])
In [49]: df2
Out[49]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
six 2003 Nevada 3.2 NaN
- 另一種常見的創(chuàng)建DataFrame方式是使用嵌套字典,如果嵌套字典傳給DataFrame,pandas就會(huì)被解釋為外層字典的鍵作為列,內(nèi)層字典鍵則作為行索引:
In [65]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
....: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [66]: df3 = pd.DataFrame(pop)
In [67]: df3
Out[67]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
7178691-106835b28c0cea5a.png
DataFrame對(duì)象操作
-
df.values:將DataFrame轉(zhuǎn)換為ndarray二維數(shù)組,注意后面不加()。
- 通過(guò)類似字典標(biāo)記的方式或?qū)傩缘姆绞?,可以將DataFrame的列獲取為一個(gè)Series。
- 列可以通過(guò)賦值的方式進(jìn)行修改。例如,我們可以給那個(gè)空的"debt"列賦上一個(gè)標(biāo)量值或一組值。
- 將列表或數(shù)組賦值給某個(gè)列時(shí),其長(zhǎng)度必須跟DataFrame的長(zhǎng)度相匹配。如果賦值的是一個(gè)Series,就會(huì)精確匹配DataFrame的索引,所有的空位都將被填上缺失值。
- 為不存在的列賦值會(huì)創(chuàng)建出一個(gè)新列。關(guān)鍵字del用于刪除列。
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])
In [50]: df2.columns
Out[50]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
#通過(guò)類似字典標(biāo)記的方式或?qū)傩缘姆绞?,可以將DataFrame的列獲取為一個(gè)Series。
In [51]: df2['state'] #或者df2.state
Out[51]:
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada
Name: state, dtype: object
#列可以通過(guò)賦值的方式進(jìn)行修改。例如,我們可以給那個(gè)空的"debt"列賦上一個(gè)標(biāo)量值或一組值
In [54]: frame2['debt'] = 16.5
In [55]: frame2
Out[55]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
six 2003 Nevada 3.2 16.5
#將列表或數(shù)組賦值給某個(gè)列時(shí),其長(zhǎng)度必須跟DataFrame的長(zhǎng)度相匹配。如果賦值的是一個(gè)Series,就會(huì)精確匹配DataFrame的索引,所有的空位都將被填上缺失值
In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
In [59]: df2['debt'] = val
In [60]: df2
Out[60]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
six 2003 Nevada 3.2 16.5
#為不存在的列賦值,會(huì)創(chuàng)建出一個(gè)新列
In [61]: df2['eastern'] = df2.state == 'Ohio'
In [62]: df2
Out[62]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
six 2003 Nevada 3.2 NaN False
#關(guān)鍵字del用于刪除列
In [63]: del df2['eastern']
In [64]: df2.columns
Out[64]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
pandas的基本功能
數(shù)據(jù)索引:Series和DataFrame的索引是Index類型,Index對(duì)象是不可修改,可通過(guò)索引值或索引標(biāo)簽獲取目標(biāo)數(shù)據(jù),也可通過(guò)索引使序列或數(shù)據(jù)框的計(jì)算、操作實(shí)現(xiàn)自動(dòng)化對(duì)齊。索引類型index的常用方法:
重新索引:能夠改變、重排Series和DataFrame索引,會(huì)創(chuàng)建一個(gè)新對(duì)象,如果某個(gè)索引值當(dāng)前不存在,就引入缺失值。
df.reindex(index, columns ,fill_value, method, limit, copy ):index/columns為新的行列自定義索引;fill_value為用于填充缺失位置的值;method為填充方法,ffill當(dāng)前值向前填充,bfill向后填充;limit為最大填充量;copy 默認(rèn)True,生成新的對(duì)象,F(xiàn)alse時(shí),新舊相等不復(fù)制。
In [98]: frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
....: index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])
In [99]: frame
Out[99]:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
In [100]: frame2 = frame.reindex(['a', 'b', 'c', 'd'])
In [101]: frame2
Out[101]:
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
刪除指定索引:默認(rèn)返回的是一個(gè)新對(duì)象。
.drop():能夠刪除Series和DataFrame指定行或列索引。
刪除一行或者一列時(shí),用單引號(hào)指定索引,刪除多行時(shí)用列表指定索引。
如果刪除的是列索引,需要增加axis=1或axis='columns'作為參數(shù)。
增加inplace=True作為參數(shù),可以就地修改對(duì)象,不會(huì)返回新的對(duì)象。
索引、選取和過(guò)濾
df.loc[行標(biāo)簽,列標(biāo)簽]:通過(guò)標(biāo)簽查詢指定的數(shù)據(jù),第一個(gè)值為行標(biāo)簽,第二值為列標(biāo)簽。當(dāng)?shù)诙€(gè)參數(shù)為空時(shí),查詢的是單個(gè)或多個(gè)行的所有列。如果查詢多個(gè)行、列的話,則兩個(gè)參數(shù)用列表表示。
df.iloc[行位置,列位置]:通過(guò)默認(rèn)生成的數(shù)字索引查詢指定的數(shù)據(jù)。
In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)),
.....: index=['Ohio', 'Colorado', 'Utah', 'New York'],
.....: columns=['one', 'two', 'three', 'four'])
?
In [129]: data
Out[129]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
#df.loc選取第二行、第二三列
In [137]: data.loc['Colorado', ['two', 'three']]
Out[137]:
two 5
three 6
Name: Colorado, dtype: int64
#df.iloc選取第二行、第二三列
In [138]: data.iloc[1, [1, 2]]
Out[138]:
two 5
three 6
Name: Colorado, dtype: int64
在pandas中,有多個(gè)方法可以選取和重新組合數(shù)據(jù)。對(duì)于DataFrame,表5-4進(jìn)行了總結(jié)
表5-4 DataFrame的索引選項(xiàng)
算術(shù)運(yùn)算:算術(shù)運(yùn)算根據(jù)行列索引,對(duì)齊后運(yùn)算,運(yùn)算默認(rèn)產(chǎn)生浮點(diǎn)數(shù),對(duì)齊時(shí)缺項(xiàng)填充NaN (空值)。除了用+-*/外,還可以用Series和DataFrame的算術(shù)方法,這些方法傳入fill_value參數(shù)時(shí),可以填充缺省值。比如df1.add(df2, fill_value = 1):比較運(yùn)算只能比較相同索引的元素,不進(jìn)行補(bǔ)齊。采用>< >= <= == !=等符號(hào)進(jìn)行的比較運(yùn)算,產(chǎn)生布爾值。
排序 :在排序時(shí),任何缺失值默認(rèn)都會(huì)被放到末尾
.sort_index(axis=0, ascending=True):根據(jù)指定軸索引的值進(jìn)行排序。默認(rèn)軸axis=0, ascending=True,即默認(rèn)根據(jù)0軸的索引值做升序排序。軸axis=1為根據(jù)1軸的索引值排序, ascending=False為降序。
在指定軸上根據(jù)數(shù)值進(jìn)行排序,默認(rèn)升序。
Series.sort_values(axis=0, ascending=True):只能根據(jù)0軸的值排序。
DataFrame.sort_values(by, axis=0, ascending=True),參數(shù)by為axis軸上的某個(gè)索引或索引列表。
pandas數(shù)據(jù)分析
統(tǒng)計(jì)分析、相關(guān)分析
適用于Series和DataFrame的基本統(tǒng)計(jì)分析函數(shù):傳入axis='columns'或axis=1將會(huì)按行進(jìn)行運(yùn)算。
.describe():針對(duì)各列的多個(gè)統(tǒng)計(jì)匯總,用統(tǒng)計(jì)學(xué)指標(biāo)快速描述數(shù)據(jù)的概要。
.sum():計(jì)算各列數(shù)據(jù)的和
.count():非NaN值的數(shù)量
.mean( )/.median():計(jì)算數(shù)據(jù)的算術(shù)平均值、算術(shù)中位數(shù)
.var()/.std():計(jì)算數(shù)據(jù)的方差、標(biāo)準(zhǔn)差
.corr()/.cov():計(jì)算相關(guān)系數(shù)矩陣、協(xié)方差矩陣,是通過(guò)參數(shù)對(duì)計(jì)算出來(lái)的。Series的corr方法用于計(jì)算兩個(gè)Series中重疊的、非NA的、按索引對(duì)齊的值的相關(guān)系數(shù)。DataFrame的corr和cov方法將以DataFrame的形式分別返回完整的相關(guān)系數(shù)或協(xié)方差矩陣。
.corrwith():利用DataFrame的corrwith方法,可以計(jì)算其列或行跟另一個(gè)Series或DataFrame之間的相關(guān)系數(shù)。傳入一個(gè)Series將會(huì)返回一個(gè)相關(guān)系數(shù)值Series(針對(duì)各列進(jìn)行計(jì)算),傳入一個(gè)DataFrame則會(huì)計(jì)算按列名配對(duì)的相關(guān)系數(shù)。
.min()/.max():計(jì)算數(shù)據(jù)的最小值、最大值
.diff():計(jì)算一階差分,對(duì)時(shí)間序列很有效
.mode():計(jì)算眾數(shù),返回頻數(shù)最高的那(幾)個(gè)
.mean():計(jì)算均值
.quantile():計(jì)算分位數(shù)(0到1)
.isin():用于判斷矢量化集合的成員資格,可用于過(guò)濾Series中或DataFrame列中數(shù)據(jù)的子集
適用于Series的基本統(tǒng)計(jì)分析函數(shù),DataFrame[列名]返回的是一個(gè)Series類型。
.unique():返回一個(gè)Series中的唯一值組成的數(shù)組。
.value_counts():計(jì)算一個(gè)Series中各值出現(xiàn)的頻率。
.argmin()/.argmax():計(jì)算數(shù)據(jù)最大值、最小值所在位置的索引位置(自動(dòng)索引)
.idxmin()/.idxmax():計(jì)算數(shù)據(jù)最大值、最小值所在位置的索引(自定義索引)
分組
pandas讀寫文本格式的數(shù)據(jù)
pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對(duì)象的函數(shù)。下表對(duì)它們進(jìn)行了總結(jié),其中read_csv()、read_table()、to_csv()是用得最多的。 工作中實(shí)際碰到的數(shù)據(jù)可能十分混亂,一些數(shù)據(jù)加載函數(shù)(尤其是read_csv)的參數(shù)非常多(read_csv有超過(guò)50個(gè)參數(shù))。具體使用參考https://seancheney./python-for-data-analysis-2nd/di-06-zhang-shu-ju-jia-zai-cun-chu-yu-wen-jian-ge-shi
用pandas來(lái)進(jìn)行數(shù)據(jù)清洗和準(zhǔn)備
在數(shù)據(jù)分析和建模的過(guò)程中,相當(dāng)多的時(shí)間要用在數(shù)據(jù)準(zhǔn)備上:加載、清理、轉(zhuǎn)換以及重塑。
處理缺失數(shù)據(jù)
在許多數(shù)據(jù)分析工作中,缺失數(shù)據(jù)是經(jīng)常發(fā)生的。對(duì)于數(shù)值數(shù)據(jù),pandas使用浮點(diǎn)值NaN(np.nan)表示缺失數(shù)據(jù),也可將缺失值表示為NA(Python內(nèi)置的None值)。
-
.info():查看數(shù)據(jù)的信息,包括每個(gè)字段的名稱、非空數(shù)量、字段的數(shù)據(jù)類型。
-
.isnull():返回一個(gè)同樣長(zhǎng)度的值為布爾型的對(duì)象(Series或DataFrame),表示哪些值是缺失的,.notnull()為其否定形式。
import pandas as pd
import numpy as np
In [10]: string_data = pd.Series(['aardvark', 'artichoke', np.nan, None])
In [11]: string_data
Out[11]:
0 aardvark
1 artichoke
2 NaN
3 None
dtype: object
In [14]: string_data.isnull()
Out[14]:
0 False
1 False
2 True
3 True
dtype: bool
-
.dropna():刪除缺失數(shù)據(jù)。對(duì)于Series對(duì)象,dropna返回一個(gè)僅含非空數(shù)據(jù)和索引值的Series。對(duì)于DataFrame對(duì)象,dropna默認(rèn)刪除含有缺失值的行;如果想刪除含有缺失值的列,需傳入axis = 1作為參數(shù);如果想刪除全部為缺失值的行或者列,需傳入how='all'作為參數(shù);如果想留下一部分缺失數(shù)據(jù),需傳入thresh = n作為參數(shù),表示每行至少n個(gè)非NA值。
import pandas as pd
import numpy as np
In [19]: data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
In [20]: data.dropna()
Out[22]:
0 1 2
0 1.0 6.5 3.0
#傳入how='all'將只丟棄全為NA的那些行:
In [23]: data.dropna(how='all')
Out[23]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
In [24]: data[4] = NA
In [25]: data
Out[25]:
0 1 2 4
0 1.0 6.5 3.0 NaN
1 1.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 6.5 3.0 NaN
#用這種方式丟棄列,只需傳入axis=1即可:
In [26]: data.dropna(axis=1, how='all')
Out[26]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
#假設(shè)你只想留下一部分觀測(cè)數(shù)據(jù),可以用thresh參數(shù)實(shí)現(xiàn)此目的:
In [27]: df = pd.DataFrame(np.random.randn(7, 3))
In [28]: df.iloc[:4, 1] = NA
In [29]: df.iloc[:2, 2] = NA
In [30]: df
Out[30]:
0 1 2
0 -0.204708 NaN NaN
1 -0.555730 NaN NaN
2 0.092908 NaN 0.769023
3 1.246435 NaN -1.296221
4 0.274992 0.228913 1.352917
5 0.886429 -2.001637 -0.371843
6 1.669025 -0.438570 -0.539741
In [32]: df.dropna(thresh=2)
Out[32]:
0 1 2
2 0.092908 NaN 0.769023
3 1.246435 NaN -1.296221
4 0.274992 0.228913 1.352917
5 0.886429 -2.001637 -0.371843
6 1.669025 -0.438570 -0.539741
-
.fillna(value,method,limit,inplace):填充缺失值。value為用于填充的值(比如0、'a'等)或者是字典(比如{'列':1,'列':8,……}為指定列的缺失數(shù)據(jù)填充值);method默認(rèn)值為ffill,向前填充,bfill為向后填充;limit為向前或者向后填充的最大填充量。inplace默認(rèn)會(huì)返回新對(duì)象,修改為inplace=True可以對(duì)現(xiàn)有對(duì)象進(jìn)行就地修改。
數(shù)據(jù)轉(zhuǎn)換
替換值
.replace(old, new):用新的數(shù)據(jù)替換老的數(shù)據(jù),如果希望一次性替換多個(gè)值,old和new可以是列表。默認(rèn)會(huì)返回一個(gè)新的對(duì)象,傳入inplace=True可以對(duì)現(xiàn)有對(duì)象進(jìn)行就地修改。
刪除重復(fù)數(shù)據(jù)
-
.duplicated():判斷各行是否是重復(fù)行(前面出現(xiàn)過(guò)的行),返回一個(gè)布爾型Series。
-
.drop_duplicates():刪除重復(fù)行,返回刪除后的DataFrame對(duì)象。默認(rèn)保留的是第一個(gè)出現(xiàn)的行,傳入keep='last'作為參數(shù)后,則保留最后一個(gè)出現(xiàn)的行。
- 兩者都默認(rèn)會(huì)對(duì)全部列做判斷,在傳入列索引組成的列表[ '列1' , '列2' , ……]作為參數(shù)后,可以只對(duì)這些列進(jìn)行重復(fù)項(xiàng)判斷。
利用函數(shù)或字典進(jìn)行數(shù)據(jù)轉(zhuǎn)換
- Series.map():接受一個(gè)函數(shù)或字典作為參數(shù)。使用map方法是一種實(shí)現(xiàn)元素級(jí)轉(zhuǎn)換以及其他數(shù)據(jù)清理工作的便捷方式。
import pandas as pd
In [52]: data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon','pastrami', 'corned beef', 'bacon','pastrami', 'honey ham', 'nova lox'],
.... 'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
meat_to_animal = {
'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 'corned beef': 'cow',
'honey ham': 'pig', 'nova lox': 'salmon'
}
#增加一列animal
In [57]: data['animal'] = data['food'].map(meat_to_animal)
In [58]: data
Out[58]:
food ounces animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
DataFrame常見函數(shù)
df.head():查詢數(shù)據(jù)的前五行
df.tail():查詢數(shù)據(jù)的末尾5行
pandas.cut()
pandas.qcut() 基于分位數(shù)的離散化函數(shù)?;谥然蚧跇颖痉治粩?shù)將變量離散化為等大小桶。
pandas.date_range() 返回一個(gè)時(shí)間索引
df.apply() 沿相應(yīng)軸應(yīng)用函數(shù)
Series.value_counts() 返回不同數(shù)據(jù)的計(jì)數(shù)值
df.aggregate()
df.reset_index() 重新設(shè)置index,參數(shù)drop = True時(shí)會(huì)丟棄原來(lái)的索引,設(shè)置新的從0開始的索引。常與groupby()一起用
numpy.zeros()
|