1. 程式人生 > >6個冷門但實用的pandas知識點

6個冷門但實用的pandas知識點

# 1 簡介   `pandas`作為開展資料分析的利器,蘊含了與資料處理相關的豐富多樣的API,使得我們可以靈活方便地對資料進行各種加工,但很多`pandas`中的實用方法其實大部分人都是不知道的,今天就來給大家介紹6個不太為人們所所熟知的實用`pandas`小技巧。
圖1
# 2 6個實用的`pandas`小知識 ## 2.1 Series與DataFrame的互轉   很多時候我們計算過程中產生的結果是`Series`格式的,而接下來的很多操作尤其是使用**鏈式**語法時,需要銜接著傳入`DataFrame`格式的變數,這種時候我們就可以使用到`pandas`中`Series`向`DataFrame`轉換的方法: - **利用to_frame()實現Series轉DataFrame** ```Python s = pd.Series([0, 1, 2]) # Series轉為DataFrame,name引數用於指定轉換後的欄位名 s = s.to_frame(name='列名') s ```
圖2
  順便介紹一下單列資料組成的資料框轉為`Series`的方法: - **利用squeeze()實現單列資料DataFrame轉Series** ```Python # 只有單列資料的DataFrame轉為Series s.squeeze() ```
圖3
## 2.2 隨機打亂DataFrame的記錄行順序   有時候我們需要對資料框整體的行順序進行打亂,譬如在訓練機器學習模型時,打亂原始資料順序後取前若干行作為訓練集後若干行作為測試集,這在`pandas`中可以利用`sample()`方法快捷實現。   `sample()`方法的本質功能是從原始資料中抽樣行記錄,預設為不放回抽樣,其引數`frac`用於控制抽樣比例,我們將其設定為1則等價於打亂順序: ```Python df = pd.DataFrame({ 'V1': range(5), 'V2': range(5) }) df.sample(frac=1) ```
圖4
## 2.3 利用類別型資料減少記憶體消耗   當我們的資料框中某些列是由少數幾種值大量重複形成時,會消耗大量的記憶體,就像下面的例子一樣: ```Python import numpy as np pool = ['A', 'B', 'C', 'D'] # V1列由ABCD大量重複形成 df = pd.DataFrame({ 'V1': np.random.choice(pool, 1000000) }) # 檢視記憶體使用情況 df.memory_usage(deep=True) ```
圖5
     這種時候我們可以使用到`pandas`資料型別中的類別型來極大程度上減小記憶體消耗: ```Python df['V1'] = df['V1'].astype('category') df.memory_usage(deep=True) ```
圖6
     可以看到,轉換型別之後記憶體消耗減少了將近98.3%! ## 2.4 pandas中的object型別陷阱   在日常使用`pandas`處理資料的過程中,經常會遇到`object`這種資料型別,很多初學者都會把它視為字串,事實上`object`在`pandas`中可以代表不確定的資料型別,即型別為`object`的`Series`中可以混雜著多種資料型別: ```Python s = pd.Series(['111100', '111100', 111100, '111100']) s ```
圖7
  檢視型別分佈: ```Python s.apply(lambda s: type(s)) ```
圖8
  這種情況下,如果貿然當作字串列來處理,對應的無法處理的元素只會變成缺失值而不報錯,給我們的分析過程帶來隱患: ```Python s.str.replace('00', '11') ```
圖9
  這種時候就一定要先轉成對應的型別,再執行相應的方法: ```Python s.astype('str').str.replace('00', '11') ```
圖10
## 2.5 快速判斷每一列是否有缺失值   在`pandas`中我們可以對單個`Series`檢視`hanans`屬性來了解其是否包含缺失值,而結合`apply()`,我們就可以快速檢視整個資料框中哪些列含有缺失值: ```Python df = pd.DataFrame({ 'V1': [1, 2, None, 4], 'V2': [1, 2, 3, 4], 'V3': [None, 1, 2, 3] }) df.apply(lambda s: s.hasnans) ```
圖11
## 2.6 使用rank()計算排名時的五種策略   在`pandas`中我們可以利用`rank()`方法計算某一列資料對應的排名資訊,但在`rank()`中有引數`method`來控制具體的結果計算策略,有以下5種策略,在具體使用的時候要根據需要靈活選擇: - **average**   在`average`策略下,相同數值的元素的排名是其內部排名的均值: ```Python s = pd.Series([1, 2, 2, 2, 3, 4, 4, 5, 6]) s.rank(method='average') ```
圖12
- **min**   在`min`策略下,相同元素的排名為其內部排名的最小值: ```Python s.rank(method='min') ```
圖13
- **max**   `max`策略與`min`正好相反,取的是相同元素內部排名的最大值: ```Python s.rank(method='max') ```
圖14
- **dense**   在`dense`策略下,相當於對序列去重後進行排名,再將每個元素的排名賦給相同的每個元素,這種方式也是比較貼合實際需求的: ```Python s.rank(method='dense') ```
圖15
- **first**   在`first`策略下,當多個元素相同時,會根據這些相同元素在實際`Series`中的順序分配排名: ```Python s = pd.Series([2, 2, 2, 1, 3]) s.rank(method='first') ```
圖16
---   關於`pandas`還有很多實用的小知識,以後會慢慢給大家不定期分享~歡迎在評論區與我進行討論