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