人生苦短,我用 Python
前文傳送門:
小白學 Python 數據分析(2):Pandas (一)概述
小白學 Python 數據分析(3):Pandas (二)數據結構 Series
小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrame
小白學 Python 數據分析(5):Pandas (四)基礎操作(1)查看數據
引言
上一篇文章我們介紹如何在 Pandas 一些基礎的查看數據的操作,但是官方更推薦我們使用 .at
、.iat
、.loc
和 .iloc
這幾個經過 Pandas 優化過的數據訪問方法來訪問數據。
首先我們還是先創建一個 DataFrame 用作演示,小編偷懶,接着把上一篇的 DataFrame 拷貝過來了,如下:
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 ,如下:
# 獲取單列,獲得 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 上,方便大家取用。