Python數(shù)據(jù)分析[3] - Pandas包

Series

Series是一個(gè)一維的向量,每個(gè)值都會(huì)有對(duì)應(yīng)標(biāo)簽,該標(biāo)簽我們稱之為Index

Obj = Series([4, 5, -7, 8])

Obj
Out[5]: 
0    4
1    5
2   -7
3    8
dtype: int64

Obj2 = Series([4, 5, -7, 8], index = ['a', 'b', 'c', 'd'])

Obj2
Out[7]: 
a    4
b    5
c   -7
d    8
dtype: int64

通過(guò)Index可以對(duì)Series進(jìn)行查詢以及修改

Obj2['a']
Out[12]: 4

Obj2['a'] = 0

Obj2
Out[14]: 
a    0
b    5
c   -7
d    8
dtype: int64

Numpy函數(shù)小腊,以及其他類Numpy的向量計(jì)算函數(shù)番甩,可以應(yīng)用在Series中,與Numpy的ndarrays基本相同

Obj * 2
Out[16]: 
0     8
1    10
2   -14
3    16
dtype: int64

python的dict數(shù)據(jù)可以直接轉(zhuǎn)換為Series

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata)

obj3
Out[17]: 
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

DataFrame

DataFrame是我作為數(shù)據(jù)分析師朴皆,最為常用的一個(gè)數(shù)據(jù)類型。DataFrame代表了一個(gè)長(zhǎng)方形的表泛粹,包含了任意的長(zhǎng)度及寬度(可以理解為在Excel中的一個(gè)表)遂铡。DataFrame擁有Column Index和Row Index(行標(biāo)與列標(biāo))。
最常見(jiàn)的創(chuàng)建DataFrame的方法為從一個(gè)包含了Numpy arrays的dict數(shù)據(jù)轉(zhuǎn)換

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]} 
frame = pd.DataFrame(data)

frame
Out[19]: 
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

在創(chuàng)建通過(guò)表頭的名字晶姊,我們可以更換列的順序

frame = pd.DataFrame(data, columns = ['year', 'state', 'pop'])

frame
Out[21]: 
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
5  2003  Nevada  3.2

創(chuàng)建完成后扒接,可以選擇使用列名查詢某列

frame['pop']
Out[22]: 
0    1.5
1    1.7
2    3.6
3    2.4
4    2.9
5    3.2

loc方法可以查詢某行

frame.loc[1]
Out[23]: 
year     2001
state    Ohio
pop       1.7
Name: 1, dtype: object

直接指定好列名以及對(duì)應(yīng)的行,便可以很便利的向pandas添加數(shù)據(jù)们衙,空的數(shù)據(jù)會(huì)在pandas中展示為NaN

frame['city'] = Series(['Kent', 'Las Vegas'], index = [0, 3])

frame
Out[25]: 
   year   state  pop       city
0  2000    Ohio  1.5       Kent
1  2001    Ohio  1.7        NaN
2  2002    Ohio  3.6        NaN
3  2001  Nevada  2.4  Las Vegas
4  2002  Nevada  2.9        NaN
5  2003  Nevada  3.2        NaN
Pandas方法

使用loc和iloc可以對(duì)一個(gè)dataframe執(zhí)行分頁(yè)操作
loc為選取該名字的行與列钾怔,iloc為選取第x行和第y列

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]} 
frame = pd.DataFrame(data, index = ['one', 'two', 'three', 'four', 'five', 'six'])

frame
Out[34]: 
        state  year  pop
one      Ohio  2000  1.5
two      Ohio  2001  1.7
three    Ohio  2002  3.6
four   Nevada  2001  2.4
five   Nevada  2002  2.9
six    Nevada  2003  3.2

frame.loc[['two', 'three'], ['state', 'year']]
Out[37]: 
      state  year
two    Ohio  2001
three  Ohio  2002

frame.iloc[[2, 3], [0, 1]]
Out[38]: 
        state  year
three    Ohio  2002
four   Nevada  2001

DataFrame 計(jì)算與缺失值

DataFrame基礎(chǔ)計(jì)算方法包括了加、減砍艾、乘蒂教、除、次方脆荷、整除等


計(jì)算方法

在計(jì)算方法中凝垛,fill_value值可以控制缺失值的替換

df1 = DataFrame(np.arange(12.).reshape(3, 4), columns = list('abcd'))
df2 = DataFrame(np.arange(15.).reshape(3, 5), columns = list('abecd'))

df1
Out[59]: 
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

df2
Out[60]: 
      a     b     e     c     d
0   0.0   1.0   2.0   3.0   4.0
1   5.0   6.0   7.0   8.0   9.0
2  10.0  11.0  12.0  13.0  14.0

df1 + df2
Out[61]: 
      a     b     c     d   e
0   0.0   2.0   5.0   7.0 NaN
1   9.0  11.0  14.0  16.0 NaN
2  18.0  20.0  23.0  25.0 NaN

df1.add(df2, fill_value = 0)
Out[62]: 
      a     b     c     d     e
0   0.0   2.0   5.0   7.0   2.0
1   9.0  11.0  14.0  16.0   7.0
2  18.0  20.0  23.0  25.0  12.0

除此之外reindex可以調(diào)整一個(gè)dataframe的shape,例如df1可以添加一行與df2保持一致

df1.reindex(columns = df2.columns, fill_value = 0)
Out[63]: 
     a    b  e     c     d
0  0.0  1.0  0   2.0   3.0
1  4.0  5.0  0   6.0   7.0
2  8.0  9.0  0  10.0  11.0

函數(shù)應(yīng)用以及mapping

NumPy的ufuncs(向量化函數(shù))是可以在DataFrame中應(yīng)用的
例如我們定義一個(gè)函數(shù)蜓谋,求該行的范圍(最大值與最小值的絕對(duì)差)

frame
Out[152]: 
          b     d     e
Utah    0.0   1.0   2.0
Ohio    3.0   4.0   5.0
Texas   6.0   7.0   8.0
Oregon  9.0  10.0  11.0

get_range = lambda x: x.max() - x.min()

frame.apply(get_range)
Out[154]: 
b    9.0
d    9.0
e    9.0
dtype: float64

frame.apply(get_range, axis = 'columns')
Out[158]: 
Utah      2.0
Ohio      2.0
Texas     2.0
Oregon    2.0
dtype: float64

創(chuàng)建描述性統(tǒng)計(jì)函數(shù)

data = pd.DataFrame(np.random.randn(1000, 4))

data
Out[296]: 
            a         b         c         d
0    0.660991  1.166362 -0.282237 -0.061292
1   -0.815670  0.220678 -0.072469 -0.343580
2   -1.431911  0.824215 -0.915729 -0.659971
3    0.696466 -0.556472  0.129206  0.739566
4   -1.475857 -0.043149 -1.839006  0.099850
..        ...       ...       ...       ...
995  0.135430  0.923296 -0.819932 -0.876656
996  1.767997  1.747973 -0.609283 -0.608092
997 -0.239235  0.376930  0.154019  0.660505
998  0.202736 -0.214131  0.926638 -0.810888
999 -0.144855 -0.463251  0.984850  1.368218

[1000 rows x 4 columns]

def statistical_describe(DataFrame_input) -> DataFrame:
    return DataFrame_input.apply(lambda x: pd.Series([len(x), sum(x)/len(x), 
                                               (sum((x - sum(x)/len(x))**2)/len(x))**.5,
                                               x.min(), x.quantile(.25), x.quantile(.5), x.quantile(.75), x.max()],
                                              index = ['count', 'mean', 'std', 'min', '.25', '.50', '.75', 'max']))



statistical_describe(data)
Out[297]: 
                 a            b            c            d
count  1000.000000  1000.000000  1000.000000  1000.000000
mean      0.035889     0.031281    -0.005168    -0.063525
std       1.035586     0.978126     0.975315     0.994380
min      -3.068035    -3.513137    -3.373269    -3.251473
.25      -0.643046    -0.594430    -0.664430    -0.749127
.50       0.006002     0.051688    -0.010682    -0.087670
.75       0.714898     0.715789     0.663933     0.605968
max       3.790818     3.867886     2.673977     3.488003
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梦皮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桃焕,更是在濱河造成了極大的恐慌剑肯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件观堂,死亡現(xiàn)場(chǎng)離奇詭異让网,居然都是意外死亡呀忧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門溃睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)而账,“玉大人,你說(shuō)我怎么就攤上這事因篇∨⒎” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵竞滓,是天一觀的道長(zhǎng)咐吼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)商佑,這世上最難降的妖魔是什么锯茄? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮莉御,結(jié)果婚禮上撇吞,老公的妹妹穿的比我還像新娘俗冻。我一直安慰自己礁叔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布迄薄。 她就那樣靜靜地躺著琅关,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讥蔽。 梳的紋絲不亂的頭發(fā)上涣易,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音冶伞,去河邊找鬼新症。 笑死,一個(gè)胖子當(dāng)著我的面吹牛响禽,可吹牛的內(nèi)容都是我干的徒爹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芋类,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隆嗅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起侯繁,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胖喳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贮竟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丽焊,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较剃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了技健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片重付。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凫乖,靈堂內(nèi)的尸體忽然破棺而出确垫,到底是詐尸還是另有隱情,我是刑警寧澤帽芽,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布删掀,位于F島的核電站,受9級(jí)特大地震影響导街,放射性物質(zhì)發(fā)生泄漏披泪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一搬瑰、第九天 我趴在偏房一處隱蔽的房頂上張望款票。 院中可真熱鬧,春花似錦泽论、人聲如沸艾少。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缚够。三九已至,卻和暖如春鹦赎,著一層夾襖步出監(jiān)牢的瞬間谍椅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工古话, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雏吭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓陪踩,卻偏偏與公主長(zhǎng)得像杖们,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膊毁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容