【轉】Pandas學習筆記(二)選擇數據

Pandas學習筆記系列:html

原文:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/3-2-pd-indexing/ 有刪改python

下面例子是以 6X4 的矩陣數據爲基礎進行介紹git

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])

"""
             A   B   C   D
2013-01-01   0   1   2   3
2013-01-02   4   5   6   7
2013-01-03   8   9  10  11
2013-01-04  12  13  14  15
2013-01-05  16  17  18  19
2013-01-06  20  21  22  23
"""

簡單的篩選

使用下標和標籤索引

若是咱們想選取DataFrame中的數據,下面描述了兩種途徑, 他們都能達到同一個目的:github

print(df['A'])
print(df.A)

"""
2013-01-01     0
2013-01-02     4
2013-01-03     8
2013-01-04    12
2013-01-05    16
2013-01-06    20
Freq: D, Name: A, dtype: int64
"""

讓選擇跨越多行或多列:學習

print(df[0:3])
 
"""
            A  B   C   D
2013-01-01  0  1   2   3
2013-01-02  4  5   6   7
2013-01-03  8  9  10  11
"""

print(df['20130102':'20130104'])

"""
A   B   C   D
2013-01-02   4   5   6   7
2013-01-03   8   9  10  11
2013-01-04  12  13  14  15
"""

若是df[3:3]將會是一個空對象。後者選擇2013-01-022013-01-04標籤之間的數據,而且包括這兩個標籤。spa

另外在實驗中我嘗試過df['2013-01-04']df['20130104']都會報錯,報錯信息是沒有這兩個key。因此我進一步作以下實驗:code

df2 = pd.DataFrame([[0,1],[2,3]],index=['a','b'], columns=['b','a'])
print(df2)

"""
   b  a
a  0  1
b  2  3
"""
  • 實驗1
print(df2.a)
"""
a    1
b    3
Name: a, dtype: int64
"""

print(df2['b'])
"""
a    0
b    2
Name: b, dtype: int64
"""

能夠看到這種方式是獲取列元素。htm

  • 實驗2
print(df2['a':])
"""
   b  a
a  0  1
b  2  3
"""

print(df2['b':])
"""
   b  a
b  2  3
"""

能夠看到使用:的這種方式能夠獲取行元素對象

固然這種使用標籤名來指定範圍的方法明顯很麻煩,另外有個很明顯的缺點就是若是有兩個標籤是相同的時候,你就無法用標籤來指定起始範圍了。因此咱們還能夠用數字來指定範圍,例如在該例子中df[1:]是等價於df['b':]的。blog

另外這兩種方式也存在一些區別,就是最後的一個元素,若是使用的是數字,則不會選擇到,反之若是用標籤則會選擇,看例子更好明白:

  • 實驗3
print(df2['a':'b'])
"""
   b  a
a  0  1
b  2  3
"""

print(df2[0:1])
"""
   b  a
a  0  1
"""

看了上面介紹的方法你可能有點暈頭轉向,因此也不推薦上面的索引方法。你能夠參考以下幾種方法來對數據進行篩選。

根據標籤 loc

咱們能夠使用標籤來選擇數據 loc, 也就是說這種狀況下你不能再使用數字進行索引了。本例子主要經過標籤名字選擇某一行數據, 或者經過選擇某行或者全部行(:表明全部行)而後選其中某一列或幾列數據。:

print(df.loc['20130102'])
"""
A    4
B    5
C    6
D    7
Name: 2013-01-02 00:00:00, dtype: int64
"""

print(df.loc[:,['A','B']]) 
"""
             A   B
2013-01-01   0   1
2013-01-02   4   5
2013-01-03   8   9
2013-01-04  12  13
2013-01-05  16  17
2013-01-06  20  21
"""

print(df.loc['20130102',['A','B']])
"""
A    4
B    5
Name: 2013-01-02 00:00:00, dtype: int64
"""

根據序列 iloc

另外咱們能夠採用位置進行選擇 :iloc, 在這裏咱們能夠經過位置選擇在不一樣狀況下所須要的數據例如選某一個,連續選或者跨行選等操做。

print(df.iloc[3,1])
# 13

print(df.iloc[3:5,1:3])
"""
             B   C
2013-01-04  13  14
2013-01-05  17  18
"""

print(df.iloc[[1,3,5],1:3])
"""
             B   C
2013-01-02   5   6
2013-01-04  13  14
2013-01-06  21  22

"""

在這裏咱們能夠經過位置選擇在不一樣狀況下所須要的數據, 例如選某一個,連續選或者跨行選等操做。

ix:結合lociloc

固然咱們能夠採用混合選擇 ix, 其中選擇’A’和’C’的兩列,並選擇前三行的數據。

print(df.ix[:3,['A','C']])
"""
            A   C
2013-01-01  0   2
2013-01-02  4   6
2013-01-03  8  10
"""

經過判斷的篩選

最後咱們能夠採用判斷指令 (Boolean indexing) 進行選擇. 咱們能夠約束某項條件而後選擇出當前全部數據.

print(df[df.A>8])
"""
             A   B   C   D
2013-01-04  12  13  14  15
2013-01-05  16  17  18  19
2013-01-06  20  21  22  23
"""


MARSGGBO原創


若有意合做,歡迎私戳

郵箱:marsggbo@foxmail.com

2019-10-30 11:06:08

相關文章
相關標籤/搜索