Pandas 基礎用法


 

 

Head 與 Tail

head() 與 tail() 用於快速預覽 Series 與 DataFrame,默認顯示 5 條數據,也可以指定顯示數據的數量。

 

 

 

屬性與底層數據

Pandas 可以通過多個屬性訪問元數據:

  • shape:

    • 輸出對象的軸維度,與 ndarray 一致
  • 軸標簽

    • Series: Index (僅有此軸)
    • DataFrame: Index (行) 與

注意: 為屬性賦值是安全的!

 

 

 

Pandas 對象(Index, Series, DataFrame)相當於數組的容器,用於存儲數據、執行計算。大部分類型的底層數組都是 numpy.ndarray。不過,Pandas 與第三方支持庫一般都會擴展 NumPy 類型系統,添加自定義數組(見數據類型)。

.array 屬性用於提取 Index 或 Series 里的數據。

 

 

 提取 NumPy 數組,用 to_numpy() 或 numpy.asarray()

 

 

 

to_numpy() 可以控制 numpy.ndarray 生成的數據類型。以帶時區的 datetime 為例,NumPy 未提供時區信息的 datetime 數據類型,Pandas 則提供了兩種表現形式:

  1. 一種是帶 Timestamp 的 numpy.ndarray,提供了正確的 tz 信息。

  2. 另一種是 datetime64[ns],這也是一種 numpy.ndarray,值被轉換為 UTC,但去掉了時區信息。

時區信息可以用 dtype=object 保存。

或用 dtype='datetime64[ns]' 去除。

 

 

 提取 DataFrame 里的原數據稍微有點復雜。DataFrame 里所有列的數據類型都一樣時,DataFrame.to_numpy() 返回底層數據:

 

 

 

匹配/廣播機制

DataFrame 支持 add()sub()mul()div() 及 radd()rsub() 等方法執行二進制操作。

廣播機制重點關注輸入的 Series。通過 axis 關鍵字,匹配 index 或 columns 即可調用這些函數。

 

 

 

 

 

 

 

 

 還可以用 Series 對齊多層索引 DataFrame 的某一層級。

 

 

 Series 與 Index 還支持 divmod() 內置函數,該函數同時執行向下取整除與模運算,返回兩個與左側類型相同的元組。示例如下:

 

 

 divmod() 還支持元素級運算:

 

 

缺失值與填充缺失值操作

Series 與 DataFrame 的算數函數支持 fill_value 選項,即用指定值替換某個位置的缺失值。比如,兩個 DataFrame 相加,除非兩個 DataFrame 里同一個位置都有缺失值,其相加的和仍為 NaN,如果只有一個 DataFrame 里存在缺失值,則可以用 fill_value 指定一個值來替代 NaN,當然,也可以用 fillna 把 NaN 替換為想要的值。

 

 

  

比較操作

與上一小節的算數運算類似,Series 與 DataFrame 還支持 eqneltgtlege 等二進制比較操作的方法:

 

 

 

布爾簡化

emptyany()all()bool() 可以把數據匯總簡化至單個布爾值。

 

 

 還可以進一步把上面的結果簡化為單個布爾值。

 

 

 通過 empty 屬性,可以驗證 Pandas 對象是否為空。

 

 

 

比較對象是否等效

一般情況下,多種方式都能得出相同的結果。以 df + df 與 df * 2 為例。

應用上一小節學到的知識,測試這兩種計算方式的結果是否一致,一般人都會用 (df + df == df * 2).all(),不過,這個表達式的結果是 False

 

 

 注意:布爾型 DataFrame df + df == df * 2 中有 False 值!這是因為兩個 NaN 值的比較結果為不等:

為了驗證數據是否等效,Series 與 DataFrame 等 N 維框架提供了 equals() 方法,用這個方法驗證 NaN 值的結果為相等。

 

 

 注意:Series 與 DataFrame 索引的順序必須一致,驗證結果才能為 True

 

 

 

合並重疊數據集

一個 DataFrame 中的缺失值將按指定條件用另一個 DataFrame 里類似標簽中的數據進行填充。要實現這一操作,請用下列代碼中的 combine_first() 函數。

 

 

 

 

 

 

 

 

 

描述性統計

Series 與 DataFrame 支持大量計算描述性統計的方法與操作。這些方法大部分都是 sum()mean()quantile() 等聚合函數,其輸出結果比原始數據集小;此外,還有輸出結果與原始數據集同樣大小的 cumsum() 、 cumprod() 等函數。這些方法都基本上都接受 axis 參數,如, ndarray.{sum,std,…},但這里的 axis 可以用名稱或整數指定:

    • Series:無需 axis 參數
    • DataFrame:
      • index,即 axis=0,默認值
      • columns, 即 axis=1

 

 

 上述方法都支持 skipna 關鍵字,指定是否要排除缺失數據,默認值為 True

 

 

 注 : cumsum() 與 cumprod() 等方法保留 NaN 值的位置。這與 expanding() 和 rolling() 略顯不同,詳情請參閱本文

 

 

 

下表為常用函數匯總表。每個函數都支持 level 參數,僅在數據對象為結構化 Index 時使用。

函數 描述
count 統計非空值數量
sum 匯總值
mean 平均值
mad 平均絕對偏差
median 算數中位數
min 最小值
max 最大值
mode 眾數
abs 絕對值
prod 乘積
std 貝塞爾校正的樣本標准偏差
var 無偏方差
sem 平均值的標准誤差
skew 樣本偏度 (第三階)
kurt 樣本峰度 (第四階)
quantile 樣本分位數 (不同 % 的值)
cumsum 累加
cumprod 累乘
cummax 累積最大值
cummin 累積最小值

注意:NumPy 的 meanstdsum 等方法默認不統計 Series 里的空值。但是narray 空值會計算

 

 

 Series.nunique() 返回 Series 里所有非空值的唯一值。

 

數據總結:describe

 

最大值與最小值對應的索引

 

 

 

值計數(直方圖)與眾數

 

 

 與上述操作類似,還可以統計 Series 或 DataFrame 的眾數,即出現頻率最高的值:

 

 

 

離散化與分位數

cut() 函數(以值為依據實現分箱)及 qcut() 函數(以樣本分位數為依據實現分箱)用於連續值的離散化:

 

 

 

函數應用

不管是為 Pandas 對象應用自定義函數,還是應用第三方函數,都離不開以下三種方法。用哪種方法取決於操作的對象是 DataFrame,還是 Series ;是行、列,還是元素。

  1. 表級函數應用:pipe()

  2. 行列級函數應用: apply()

  3. 聚合 API: agg() 與 transform()

  4. 元素級函數應用:applymap()

#表級函數應用

雖然可以把 DataFrame 與 Series 傳遞給函數,不過鏈式調用函數時,最好使用 pipe() 方法。對比以下兩種方式:


f(g(h(df), arg1=1), arg2=2, arg3=3)

(df.pipe(h).pipe(g, arg1=1).pipe(f, arg2=2, arg3=3))

后面再補充吧,沒看懂

行列級函數應用

apply() 方法沿着 DataFrame 的軸應用函數,比如,描述性統計方法,該方法支持 axis 參數。

 

 

 

 用好 apply() 可以了解數據集的很多信息。比如可以提取每列的最大值對應的日期:

 

 

聚合 API

聚合 API 可以快速、簡潔地執行多個聚合操作。Pandas 對象支持多個類似的 API,如 groupby APIwindow functions APIresample API

聚合函數為DataFrame.aggregate(),它的別名是 DataFrame.agg()

 

 

應用單個函數時,該操作與 apply() 等效,這里也可以用字符串表示聚合函數名。下面的聚合函數輸出的結果為 Series

 

 Series 單個聚合操作返回標量值:

 

 

多函數聚合

還可以用列表形式傳遞多個聚合函數。每個函數在輸出結果 DataFrame 里以行的形式顯示,行名是每個聚合函數的函數名。.

 

 Series 聚合多函數返回結果還是 Series,索引為函數名:

傳遞 lambda 函數時,輸出名為 <lambda> 的行:

 

 

指定為哪些列應用哪些聚合函數時,需要把包含列名與標量(或標量列表)的字典傳遞給 DataFrame.agg

注意:這里輸出結果的順序不是固定的,要想讓輸出順序與輸入順序一致,請使用 OrderedDict

 

 

Transform API

0.20.0 版新增

transform() 方法的返回結果與原始數據的索引相同,大小相同。與 .agg API 類似,該 API 支持同時處理多種操作,不用一個一個操作。

 

 

多函數 Transform

transform() 調用多個函數時,生成多層索引 DataFrame。第一層是原始數據集的列名;第二層是 transform() 調用的函數名。

 

 

用字典執行 transform 操作

函數字典可以為每列執行指定 transform() 操作。

 

 

元素級函數應用

並非所有函數都能矢量化,即接受 NumPy 數組,返回另一個數組或值,DataFrame 的 applymap() 及 Series 的 map() ,支持任何接收單個值並返回單個值的 Python 函數。

 

 

 

 Series.map() 還有個功能,可以“連接”或“映射”第二個 Series 定義的值。這與 merging / joining 功能聯系非常緊密:

 

 

重置索引與更換標簽

reindex() 是 Pandas 里實現數據對齊的基本方法,該方法執行幾乎所有功能都要用到的標簽對齊功能。 reindex 指的是沿着指定軸,讓數據與給定的一組標簽進行匹配。該功能完成以下幾項操作:

  • 讓現有數據匹配一組新標簽,並重新排序;
  • 在無數據但有標簽的位置插入缺失值(NA)標記;
  • 如果指定,則按邏輯填充無標簽的數據,該操作多見於時間序列數據。

 

 DataFrame 支持同時 reindex 索引與列:

 

 reindex 還支持 axis 關鍵字:

 

 

重置索引,並與其它對象對齊

提取一個對象,並用另一個具有相同標簽的對象 reindex 該對象的軸。這種操作的語法雖然簡單,但未免有些啰嗦。

這時,最好用 reindex_like() 方法,這是一種既有效,又簡單的方式:

 

 

用 align 對齊多個對象

align() 方法是對齊兩個對象最快的方式,該方法支持 join 參數

  • join='outer':使用兩個對象索引的合集,默認值
  • join='left':使用左側調用對象的索引
  • join='right':使用右側傳遞對象的索引
  • join='inner':使用兩個對象索引的交集

該方法返回重置索引后的兩個 Series 元組:

 

 

 

 

 

 

方法 動作
pad / ffill 先前填充
bfill / backfill 向后填充
nearest 從最近的索引值填充

下面用一個簡單的 Series 展示 fill 方法:

 

 

 

 

 

 

重置索引填充的限制

limit 與 tolerance 參數可以控制 reindex 的填充操作。limit 限定了連續匹配的最大數量:

 

 反之,tolerance 限定了索引與索引器值之間的最大距離:

 

 

去掉軸上的標簽

drop() 函數與 reindex 經常配合使用,該函數用於刪除軸上的一組標簽:

 

 

重命名或映射標簽

rename() 方法支持按不同的軸基於映射(字典或 Series)調整標簽。

 

 如果調用的是函數,該函數在處理標簽時,必須返回一個值,而且生成的必須是一組唯一值。此外,rename() 還可以調用字典或 Series。

 

 rename() 方法還提供了 inplace 命名參數,默認為 False,並會復制底層數據。inplace=True 時,會直接在原數據上重命名。

迭代

Pandas 對象基於類型進行迭代操作。Series 迭代時被視為數組,基礎迭代生成值。DataFrame 則遵循字典式習語,用對象的 key 實現迭代操作。

簡言之,基礎迭代(for i in object)生成:

  • Series :值
  • DataFrame:列標簽

例如,DataFrame 迭代時輸出列名:

 

 

項目(items)

與字典型接口類似,items() 通過鍵值對進行迭代:

    • Series:(Index,標量值)對
    • DataFrame:(列,Series)對

 

 

iterrows

iterrows() 迭代 DataFrame 或 Series 里的每一行數據。這個操作返回一個迭代器,生成索引值及包含每行數據的 Series:

 

 

.dt 訪問器

Series 提供一個可以簡單、快捷地返回 datetime 屬性值的訪問器。這個訪問器返回的也是 Series,索引與現有的 Series 一樣。

 

 

 

 用下列表達式進行篩選非常方便:

 

 時區轉換也很輕松:

 

 還可以用 Series.dt.strftime() 把 datetime 的值當成字符串進行格式化,支持與標准 strftime() 同樣的格式。

 

 

#矢量化字符串方法

Series 支持字符串處理方法,可以非常方便地操作數組里的每個元素。

這些方法會自動排除缺失值與空值,這也許是其最重要的特性。

這些方法通過 Series 的 str 屬性訪問,一般情況下,這些操作的名稱與內置的字符串方法一致。示例如下:

 

 

排序

Pandas 支持三種排序方式,按索引標簽排序,按列里的值排序,按兩種方式混合排序。

#按索引排序

Series.sort_index() 與 DataFrame.sort_index() 方法用於按索引層級對 Pandas 對象排序。

 

 

 

 

按值排序

Series.sort_values() 方法用於按值對 Series 排序。

DataFrame.sort_values() 方法用於按行列的值對 DataFrame 排序。

DataFrame.sort_values() 的可選參數 by 用於指定按哪列排序,該參數的值可以是一列或多列數據。

 

 

按索引與值排序

通過參數 by 傳遞給 DataFrame.sort_values() 的字符串可以引用列或索引層名。

 

 

 

 

搜索排序

Series 支持 searchsorted() 方法,這與numpy.ndarray.searchsorted() 的操作方式類似。

 

 

最大值與最小值

Series 支持 nsmallest() 與 nlargest() 方法,本方法返回 N 個最大或最小的值。

對於數據量大的 Series 來說,該方法比先為整個 Series 排序,再調用 head(n) 這種方式的速度要快得多。

 

 

 

 DataFrame 也支持 nlargest 與 nsmallest 方法。

 

 

 

 

 

 

#復制

在 Pandas 對象上執行 copy() 方法,將復制底層數據(但不包括軸索引,因為軸索引不可變),並返回一個新的對象。注意,復制對象這種操作一般來說不是必須的。比如說,以下幾種方式可以***就地(inplace)*** 改變 DataFrame:

  • 插入、刪除、修改列
  • 為 index 或 columns 屬性賦值
  • 對於同質數據,用 values 屬性或高級索引即可直接修改值

注意,用 Pandas 方法修改數據不會帶來任何副作用,幾乎所有方法都返回新的對象,不會修改原始數據對象。

如果原始數據有所改動,唯一的可能就是用戶顯式指定了要修改原始數據

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM