pandas筆記(Essential Functionality)

Reindexing

處理pandas對象的一個重要的方法是reindex,就是把索引重新命名。比如:

In [1]: import pandas as pd

In [2]: obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])

In [3]: obj
Out[3]:
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64

In [4]: obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])

In [5]: obj2 #缺失值會顯示NaN
Out[5]:
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64

在重新命名索引的同時,你可以進(jìn)行值的填補(bǔ),通過method這一參數(shù)設(shè)置可以實(shí)現(xiàn):

In [6]: obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])

In [7]: obj3
Out[7]:
0      blue
2    purple
4    yellow
dtype: object

In [8]: obj3.reindex(range(6),method='ffill')
Out[8]:
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object

上面是對Series數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作挺举,那么對于DateFrame數(shù)據(jù)結(jié)構(gòu)來說,reindex可以改變行的索引烘跺,也可以改變列的索引:

In [10]: import numpy as np

In [11]: frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
    ...: index=['a', 'c', 'd'],
    ...: columns=['Ohio', 'Texas', 'California'])

In [12]: frame
Out[12]:
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

In [13]: frame2 = frame.reindex(['a', 'b', 'c', 'd'])

In [14]: frame2
Out[14]:
   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

In [15]: states = ['Texas', 'Utah', 'California']

In [16]: frame.reindex(columns=states)
Out[16]:
   Texas  Utah  California
a      1   NaN           2
c      4   NaN           5
d      7   NaN           8

Dropping Entries from an Axis

從坐標(biāo)軸中刪除條目湘纵,也就是刪除一行或者多行,用drop功能實(shí)現(xiàn)滤淳,首先看一個Series的例子:

In [18]: obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])

In [19]: obj
Out[19]:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64

In [20]: new_obj = obj.drop('c')

In [21]: new_obj
Out[21]:
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64

In [23]: obj.drop(['d','c'])
Out[23]:
a    0.0
b    1.0
e    4.0
dtype: float64

再看一下從DataFrame里刪除某一行或者多行:

In [24]: data = pd.DataFrame(np.arange(16).reshape((4, 4)),
    ...: index=['Ohio', 'Colorado', 'Utah', 'New York'],
    ...: columns=['one', 'two', 'three', 'four'])

In [25]: data
Out[25]:
          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

In [26]: data.drop(['Colorado','Ohio'])
Out[26]:
          one  two  three  four
Utah        8    9     10    11
New York   12   13     14    15

刪除某一列:

#方法一
In [27]: data.drop('two',axis=1) 
Out[27]:
          one  three  four
Ohio        0      2     3
Colorado    4      6     7
Utah        8     10    11
New York   12     14    15

#方法二
In [28]: data.drop(['two','four'],axis='columns')
Out[28]:
          one  three
Ohio        0      2
Colorado    4      6
Utah        8     10
New York   12     14

Function Application and Mapping

Numpy的一些功能也適用于pandas的對象:
比如梧喷,對一個DataFrame里的元素取絕對值:

In [37]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
    ...: index=['Utah', 'Ohio', 'Texas', 'Oregon'])

In [38]: frame
Out[38]:
               b         d         e
Utah   -0.572804  0.721932 -0.444059
Ohio    0.703145 -0.214176 -1.101471
Texas   0.874537 -0.498817  1.475840
Oregon -0.122831 -0.582037 -0.465144

In [39]: np.abs(frame)
Out[39]:
               b         d         e
Utah    0.572804  0.721932  0.444059
Ohio    0.703145  0.214176  1.101471
Texas   0.874537  0.498817  1.475840
Oregon  0.122831  0.582037  0.465144

求dataframe里每一列里最大值與最小值的差:

In [40]: f = lambda x: x.max() - x.min()

In [41]: frame.apply(f)
Out[41]:
b    1.447342
d    1.303969
e    2.577311
dtype: float64

求dataframe每一行的最大值與最小值的差:

In [42]: frame.apply(f, axis='columns') #這里你沒看錯,寫的是columns娇钱,但是求的是每行里的最大值與最小值的差
Out[42]:
Utah      1.294737
Ohio      1.804616
Texas     1.974657
Oregon    0.459206
dtype: float64

上面的apply功能只是求出差值伤柄,并不能返回每一行或者每一列的最大值和最小值是多少,下面這種方法可以實(shí)現(xiàn)這個要求:

In [43]: def f(x):
    ...:     return pd.Series([x.min(),x.max()],index=['min', 'max'])
    ...:

In [44]: frame.apply(f)
Out[44]:
            b         d         e
min -0.572804 -0.582037 -1.101471
max  0.874537  0.721932  1.475840

Sorting and Ranking

根據(jù)某些條件進(jìn)行篩選dataset也是一個重要的內(nèi)置功能文搂∈实叮可以通過行索引和列索引進(jìn)行字典的篩選,使用sort_index方法煤蹭,返回一個新的對象:

#對Series進(jìn)行sorting
In [45]: obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])

In [46]: obj
Out[46]:
d    0
a    1
b    2
c    3
dtype: int64

In [47]: obj.sort_index()
Out[47]:
a    1
b    2
c    3
d    0
dtype: int64

#對dataframe進(jìn)行sorting
In [48]: frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
    ...: index=['three', 'one'],
    ...: columns=['d', 'a', 'b', 'c'])

In [49]: frame
Out[49]:
       d  a  b  c
three  0  1  2  3
one    4  5  6  7

In [50]: frame.sort_index()
Out[50]:
       d  a  b  c
one    4  5  6  7
three  0  1  2  3

按照軸來排序:

In [51]: frame.sort_index(axis=1) #軸1就是對列進(jìn)行排序
Out[51]:
       a  b  c  d
three  1  2  3  0
one    5  6  7  4

In [52]: frame.sort_index(axis=0) #軸0就是對行進(jìn)行排序
Out[52]:
       d  a  b  c
one    4  5  6  7
three  0  1  2  3

根據(jù)降序排列:

In [53]: frame.sort_index(axis=1, ascending=False)
Out[53]:
       d  c  b  a
three  0  3  2  1
one    4  7  6  5

按照某一列進(jìn)行降序排列:

In [54]: frame.sort_values(by='b',ascending=False)
Out[54]:
       d  a  b  c
one    4  5  6  7
three  0  1  2  3

下面是ranking的用法了笔喉,這里有點(diǎn)繞,我盡量用“人話”解釋清楚:

In [59]: obj = pd.Series([7, -5, 7, 4, 2, 0, 4])

In [60]: obj.rank()
Out[60]:
0    6.5
1    1.0
2    6.5
3    4.5
4    3.0
5    2.0
6    4.5
dtype: float64

上面是一個Series的ranking硝皂,根據(jù)有些文章里解釋的意思常挚,大家可以感受一下:

排名(ranking ) 跟排序關(guān)系密切, 且它會增設(shè)一個排名值(從1開始稽物, 一直到數(shù)組中有效數(shù)據(jù)的數(shù)量)奄毡。它跟numpy.argsort產(chǎn)生的間接拍下索引差不多, 只不過它可以根據(jù)某種規(guī)則破壞平級關(guān)系贝或。接下來介紹Series和Dataframe 的rank方法吼过。默認(rèn)情況下锐秦, rank是通過”為各組分配一個平均排名“的方式破壞平級關(guān)系的。

反正我是沒看懂盗忱。酱床。。也可能是我水平有限趟佃,實(shí)際上上面的obj.rank()功能可以這樣理解:

[7, -5, 7, 4, 2, 0, 4]里最小值是-5扇谣,所以索引為1的元素就是“1.0”。然后排第二小的是0闲昭,那么0的索引值是5的位置就是“2.0”罐寨。接著排第3的2也比較好理解。之后有兩個“4”汤纸,這兩個“4”分別排第4和第5(并列)衩茸,那么ranking的值就是4和5的平均數(shù)4.5。最后贮泞,兩個7的排名分別是6和7(并列),所以在對應(yīng)的索引位置是6和7的平均數(shù)6.5幔烛。

然后來看一下dataframe的ranking:

In [61]: frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],
    ...: 'c': [-2, 5, 8, -2.5]})

In [62]: frame
Out[62]:
     b  a    c
0  4.3  0 -2.0
1  7.0  1  5.0
2 -3.0  0  8.0
3  2.0  1 -2.5

In [64]: frame.rank()
Out[64]:
     b    a    c
0  3.0  1.5  2.0
1  4.0  3.5  3.0
2  1.0  1.5  4.0
3  2.0  3.5  1.0

Axis Indexes with Duplicate Labels

到目前為止啃擦,我們看到的所有示例都有唯一的axis索引值。而許多panda函數(shù)(如reindex)要求標(biāo)簽是唯一饿悬,但這不是強(qiáng)制性的令蛉。比如:

In [65]: obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])

In [66]: obj
Out[66]:
a    0
a    1
b    2
b    3
c    4
dtype: int64

In [67]: obj.index.is_unique #檢查索引值是否唯一
Out[67]: False
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者狡恬。
  • 序言:七十年代末珠叔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弟劲,更是在濱河造成了極大的恐慌祷安,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔乞,死亡現(xiàn)場離奇詭異汇鞭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庸追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門霍骄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淡溯,你說我怎么就攤上這事读整。” “怎么了咱娶?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵米间,是天一觀的道長煎楣。 經(jīng)常有香客問我,道長车伞,這世上最難降的妖魔是什么择懂? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮另玖,結(jié)果婚禮上困曙,老公的妹妹穿的比我還像新娘。我一直安慰自己谦去,他們只是感情好慷丽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳄哭,像睡著了一般要糊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妆丘,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天锄俄,我揣著相機(jī)與錄音,去河邊找鬼勺拣。 笑死奶赠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的药有。 我是一名探鬼主播毅戈,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愤惰!你這毒婦竟也來了苇经?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宦言,失蹤者是張志新(化名)和其女友劉穎扇单,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜡励,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡令花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凉倚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼都。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稽寒,靈堂內(nèi)的尸體忽然破棺而出扮碧,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布慎王,位于F島的核電站蚓土,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赖淤。R本人自食惡果不足惜蜀漆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咱旱。 院中可真熱鬧确丢,春花似錦、人聲如沸吐限。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诸典。三九已至描函,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狐粱,已是汗流浹背舀寓。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脑奠,地道東北人基公。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像宋欺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胰伍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345