小白學 Python 數據分析(6):Pandas (五)基礎操做(2)數據選擇

人生苦短,我用 Pythonhtml

前文傳送門:python

小白學 Python 數據分析(1):數據分析基礎git

小白學 Python 數據分析(2):Pandas (一)概述github

小白學 Python 數據分析(3):Pandas (二)數據結構 Series數組

小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrame數據結構

小白學 Python 數據分析(5):Pandas (四)基礎操做(1)查看數據dom

引言

上一篇文章咱們介紹如何在 Pandas 一些基礎的查看數據的操做,可是官方更推薦咱們使用 .at.iat.loc.iloc 這幾個通過 Pandas 優化過的數據訪問方法來訪問數據。優化

首先咱們仍是先建立一個 DataFrame 用做演示,小編偷懶,接着把上一篇的 DataFrame 拷貝過來了,以下:spa

import numpy as np
import pandas as pd

dates = pd.date_range('20200101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)複製代碼

DataFrame 是由不少列組成的,其實能夠看作是由多個 Series 組成,咱們能夠單獨獲取一列直接得到一個 Series ,以下:code

# 獲取單列,得到 Series
print(df['A'])

# 輸出結果
2020-01-01   -0.065477
2020-01-02   -1.089716
2020-01-03    0.049215
2020-01-04   -0.017615
2020-01-05   -0.910402
2020-01-06   -0.008887
Freq: D, Name: A, dtype: float64複製代碼

接下來咱們能夠經過 [] 對 DataFrame 進行切片操做,示例以下:

# 行切片
print(df[0:3])
print(df['20200101' : '20200103'])

# 輸出結果
                   A         B         C         D
2020-01-01 -0.065477  1.603827  1.152969  0.742842
2020-01-02 -1.089716 -0.540936  0.456917  0.295272
2020-01-03  0.049215 -1.182454 -0.294177 -0.698877
                   A         B         C         D
2020-01-01 -0.065477  1.603827  1.152969  0.742842
2020-01-02 -1.089716 -0.540936  0.456917  0.295272
2020-01-03  0.049215 -1.182454 -0.294177 -0.698877複製代碼

能夠看到,咱們經過整數或者是 columns 將 DataFrame 進行了行切片。

loc

咱們能夠經過使用 loc 進行 column 名和 index 名定位。

好比咱們經過 column 提取出一行數據,以下:

# 用標籤提取一行數據
print(df.loc[dates[0]])

# 輸出結果
A   -0.065477
B    1.603827
C    1.152969
D    0.742842
Name: 2020-01-01 00:00:00, dtype: float64複製代碼

注意,這裏的 dates 是咱們在最前面生成的一個數組,這裏的寫法一樣能夠替換成 df.loc['20200101']

一樣咱們能夠經過切片的方式獲取指定某幾行的數據,以下:

# 用標籤提取多列數據
print(df.loc[:, ['A', 'B']])

# 輸出結果
                   A         B
2020-01-01 -0.065477  1.603827
2020-01-02 -1.089716 -0.540936
2020-01-03  0.049215 -1.182454
2020-01-04 -0.017615 -0.777637
2020-01-05 -0.910402 -0.173959
2020-01-06 -0.008887  0.525035

# 用標籤進行切片操做,同時制定行與列的結束點
print(df.loc['20200101':'20200103', ['A', 'B']])

# 輸出結果
                   A         B
2020-01-01 -0.065477  1.603827
2020-01-02 -1.089716 -0.540936
2020-01-03  0.049215 -1.182454

# 返回一行中的兩列
print(df.loc['20200101', ['A', 'B']])

# 輸出結果
A   -0.065477
B    1.603827
Name: 2020-01-01 00:00:00, dtype: float64複製代碼

那麼我若是想得到一個指定位置的數據怎麼辦呢?當咱們把 DataFrame 想像成爲一個座標系的時候,固然是指定橫縱座標能夠肯定一個惟一的點啊,以下:

# 獲取某個標量值
print(df.loc[dates[0], 'A'])

# 輸出結果
-0.06547653622759132複製代碼

iloc

iloc 和上面的 loc 很像, loc 主要是經過行進行索引定位,而 iloc 是經過 index 也就是列進行索引定位,因此參數是整型, iloc 的英文全稱爲 index locate 。

先看一個簡單的示例,咱們先用整數選擇出其中的一列:

# 用整數位置選擇
print(df.iloc[3])

# 輸出結果
A   -0.017615
B   -0.777637
C    0.824364
D    0.210244
Name: 2020-01-04 00:00:00, dtype: float64複製代碼

這裏咱們還能夠加上切片進行選擇:

# 使用整數按行和列進行切片操做
print(df.iloc[3:5, 0:2])

# 輸出結果
                   A         B
2020-01-04 -0.017615 -0.777637
2020-01-05 -0.910402 -0.173959

# 用整數列表按位置切片
print(df.iloc[[1, 2, 4], [0, 2]])

# 輸出結果
                   A         C
2020-01-02 -1.089716  0.456917
2020-01-03  0.049215 -0.294177
2020-01-05 -0.910402 -1.140222

# 整行切片
print(df.iloc[1:3, :])

# 輸出結果
                   A         B         C         D
2020-01-02 -1.089716 -0.540936  0.456917  0.295272
2020-01-03  0.049215 -1.182454 -0.294177 -0.698877

# 整列切片
print(df.iloc[:, 1:3])

# 輸出結果
                   B         C
2020-01-01  1.603827  1.152969
2020-01-02 -0.540936  0.456917
2020-01-03 -1.182454 -0.294177
2020-01-04 -0.777637  0.824364
2020-01-05 -0.173959 -1.140222
2020-01-06  0.525035 -1.076101複製代碼

一樣,咱們經過 iloc 也能夠直接選擇一個標量值:

# 獲取某個標量值 同上
print(df.iloc[1, 1])

# 結果以下
-0.540936460611594複製代碼

at 和 iat

at 和 iat 都是用來訪問單個元素的,並且他們的訪問速度要快於上面的 loc 和 iloc 。

at 使用方法與 loc 相似,示例以下:

print(df.at[dates[0], 'A'])

# 輸出結果
-0.06547653622759132複製代碼

iat 對於 iloc 的關係就像 at 對於 loc 的關係,示例以下:

print(df.iat[1, 1])

# 輸出結果
-0.540936460611594複製代碼

其餘

咱們還可使用一些判斷條件來選擇數據,如用單列的值選擇數據,示例以下:

print(df[df.A > 0])

# 輸出結果
                   A         B         C         D
2020-01-03  0.049215 -1.182454 -0.294177 -0.698877複製代碼

上面這個示例是輸出的全部 A 列大於 0 的數據。

還有直接使用整個 df 作判斷的,示例以下:

print(df[df < 0])

# 輸出結果
                   A         B         C         D
2020-01-01 -0.065477       NaN       NaN       NaN
2020-01-02 -1.089716 -0.540936       NaN       NaN
2020-01-03       NaN -1.182454 -0.294177 -0.698877
2020-01-04 -0.017615 -0.777637       NaN       NaN
2020-01-05 -0.910402 -0.173959 -1.140222 -0.662615
2020-01-06 -0.008887       NaN -1.076101 -0.862407複製代碼

示例代碼

老規矩,全部的示例代碼都會上傳至代碼管理倉庫 Github 和 Gitee 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

參考

https://www.pypandas.cn/docs/getting_started/10min.html

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)
相關文章
相關標籤/搜索