教你學會 Pandas 不是個人目的,教你輕鬆玩轉 Pandas 纔是個人目的。我會經過一系列實例來帶入 Pandas 的知識點,讓你在學習 Pandas 的路上再也不枯燥。html
聲明:我所寫的輕鬆玩轉 Pandas 教程都是免費的,若是對你有幫助,你能夠持續關注我。python
Pandas 有不少高級的功能,可是想要掌握高級功能前,須要先掌握它的基礎知識,Pandas 中的數據結構算是很是基礎的知識之一了。數據庫
Pandas 經常使用的數據結構有兩種:Series 和 DataFrame。這些數據結構構建在 Numpy 數組之上,這意味着它們效率很高。咱們來分別看看這些數據結構都長什麼樣子吧。數組
# 導入相關庫
import numpy as np
import pandas as pd
複製代碼
Series 是一個帶有 名稱 和索引的一維數組,既然是數組,確定要說到的就是數組中的元素類型,在 Series 中包含的數據類型能夠是整數、浮點、字符串、Python對象等。數據結構
假定有一個場景是:存儲一些用戶的信息,暫時只包括年齡信息。學習
咱們能夠經過 Series 來存儲,這裏咱們經過 Series 存儲了四個年齡:18/30/25/40,只需將要存儲的數據構建成一個數組,而後賦值給data參數便可。人工智能
# 存儲了 4 個年齡:18/30/25/40
user_age = pd.Series(data=[18, 30, 25, 40])
user_age
複製代碼
0 18
1 30
2 25
3 40
dtype: int64
複製代碼
能夠看到,已經正確將多個年齡存儲到 Series 中了,你可能會想,單獨存儲了年齡有什麼用,我怎麼知道這個年齡屬於哪一個用戶呢?spa
咱們能夠經過 Series 的 index(索引)來解決這個問題。因爲有四個年齡,天然地也須要四個姓名,因此咱們須要構建一個與 data 長度相同的數組,而後經過下面的操做便可知足要求。excel
user_age.index = ["Tom", "Bob", "Mary", "James"]
user_age
複製代碼
Tom 18
Bob 30
Mary 25
James 40
dtype: int64
複製代碼
你看,如今姓名與年齡已經徹底對應上了。雖說咱們本身知道 Tom/Bob 這些是姓名,可是別人不知道啊,咱們怎麼告訴他人呢?code
要想讓別人知道,咱們能夠爲 index 起個名字。
user_age.index.name = "name"
user_age
複製代碼
name
Tom 18
Bob 30
Mary 25
James 40
dtype: int64
複製代碼
可能你還會想,若是別人在看我寫的代碼,怎麼能快速的知道我這寫的究竟是什麼玩意呢?
別急,就像咱們給index起名字同樣,咱們也能夠給 Series 起個名字。
user_age.name="user_age_info"
user_age
複製代碼
name
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
複製代碼
經過上面一系列的操做,咱們對 Series 的結構上有了基本的瞭解,簡單來講,一個 Series 包括了 data、index 以及 name。
上面的操做很是方便作演示來使用,若是想要快速實現上面的功能,能夠經過如下方式來實現。
# 構建索引
name = pd.Index(["Tom", "Bob", "Mary", "James"], name="name")
# 構建 Series
user_age = pd.Series(data=[18, 30, 25, 40], index=name, name="user_age_info")
user_age
複製代碼
name
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
複製代碼
另外,須要說明的是咱們在構造 Series 的時候,並無設定每一個元素的數據類型,這個時候,Pandas 會自動判斷一個數據類型,並做爲 Series 的類型。
固然了,咱們也能夠本身手動指定數據類型。
# 指定類型爲浮點型
user_age = pd.Series(data=[18, 30, 25, 40], index=name, name="user_age_info", dtype=float)
user_age
複製代碼
name
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Name: user_age_info, dtype: float64
複製代碼
Series 包含了 dict 的特色,也就意味着可使用與 dict 相似的一些操做。咱們能夠將 index 中的元素當作是 dict 中的 key。
# 獲取 Tom 的年齡
user_age["Tom"]
複製代碼
18.0
複製代碼
此外,能夠經過 get 方法來獲取。經過這種方式的好處是當索引不存在時,不會拋出異常。
user_age.get("Tom")
複製代碼
18.0
複製代碼
Series 除了像 dict 外,也很是像 ndarray,這也就意味着能夠採用切片操做。
# 獲取第一個元素
user_age[0]
複製代碼
18.0
複製代碼
# 獲取前三個元素
user_age[:3]
複製代碼
name
Tom 18.0
Bob 30.0
Mary 25.0
Name: user_age_info, dtype: float64
複製代碼
# 獲取年齡大於30的元素
user_age[user_age > 30]
複製代碼
name
James 40.0
Name: user_age_info, dtype: float64
複製代碼
# 獲取第4個和第二個元素
user_age[[3, 1]]
複製代碼
name
James 40.0
Bob 30.0
Name: user_age_info, dtype: float64
複製代碼
能夠看到,不管咱們經過切片如何操做 Series ,它都可以自動對齊 index。
Series 與 ndarray 同樣,也是支持向量化操做的。同時也能夠傳遞給大多數指望 ndarray 的 NumPy 方法。
user_age + 1
複製代碼
name
Tom 19.0
Bob 31.0
Mary 26.0
James 41.0
Name: user_age_info, dtype: float64
複製代碼
np.exp(user_age)
複製代碼
name
Tom 6.565997e+07
Bob 1.068647e+13
Mary 7.200490e+10
James 2.353853e+17
Name: user_age_info, dtype: float64
複製代碼
DataFrame 是一個帶有索引的二維數據結構,每列能夠有本身的名字,而且能夠有不一樣的數據類型。你能夠把它想象成一個 excel 表格或者數據庫中的一張表,DataFrame 是最經常使用的 Pandas 對象。
咱們繼續使用以前的實例來說解 DataFrame,在存儲用戶信息時,除了年齡以外,我還想存儲用戶所在的城市。如何經過 DataFrame 實現呢?
能夠構建一個 dict,key 是須要存儲的信息,value 是信息列表。而後將 dict 傳遞給 data 參數。
index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
data = {
"age": [18, 30, 25, 40],
"city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
}
user_info = pd.DataFrame(data=data, index=index)
user_info
複製代碼
age | city | |
---|---|---|
name | ||
Tom | 18 | BeiJing |
Bob | 30 | ShangHai |
Mary | 25 | GuangZhou |
James | 40 | ShenZhen |
能夠看到,咱們成功構建了一個 DataFrame,這個 DataFrame 的索引是用戶性別,還有兩列分別是用戶的年齡和城市信息。
除了上面這種傳入 dict 的方式構建外,咱們還能夠經過另一種方式來構建。這種方式是先構建一個二維數組,而後再生成一個列名稱列表。
data = [[18, "BeiJing"],
[30, "ShangHai"],
[25, "GuangZhou"],
[40, "ShenZhen"]]
columns = ["age", "city"]
user_info = pd.DataFrame(data=data, index=index, columns=columns)
user_info
複製代碼
age | city | |
---|---|---|
name | ||
Tom | 18 | BeiJing |
Bob | 30 | ShangHai |
Mary | 25 | GuangZhou |
James | 40 | ShenZhen |
在生成了 DataFrame 以後,能夠看到,每一行就表示某一個用戶的信息,假如我想要訪問 Tom 的信息,我該如何操做呢?
一種辦法是經過索引名來訪問某行,這種辦法須要藉助 loc 方法。
user_info.loc["Tom"]
複製代碼
age 18
city BeiJing
Name: Tom, dtype: object
複製代碼
除了直接經過索引名來訪問某一行數據以外,還能夠經過這行所在的位置來選擇這一行。
user_info.iloc[0]
複製代碼
age 18
city BeiJing
Name: Tom, dtype: object
複製代碼
如今可以訪問某一個用戶的信息了,那麼我如何訪問多個用戶的信息呢?也就是如何訪問多行呢?
藉助行切片能夠輕鬆完成,來看這裏。
user_info.iloc[1:3]
複製代碼
age | city | |
---|---|---|
name | ||
Bob | 30 | ShangHai |
Mary | 25 | GuangZhou |
學會了如何訪問行數據以外,天然而然會想到如何訪問列。咱們能夠經過屬性(「.列名」)的方式來訪問該列的數據,也能夠經過[column]的形式來訪問該列的數據。
假如我想獲取全部用戶的年齡,那麼能夠這樣操做。
user_info.age
複製代碼
name
Tom 18
Bob 30
Mary 25
James 40
Name: age, dtype: int64
複製代碼
user_info["age"]
複製代碼
name
Tom 18
Bob 30
Mary 25
James 40
Name: age, dtype: int64
複製代碼
若是想要同時獲取年齡和城市該如何操做呢?
# 能夠變換列的順序
user_info[["city", "age"]]
複製代碼
city | age | |
---|---|---|
name | ||
Tom | BeiJing | 18 |
Bob | ShangHai | 30 |
Mary | GuangZhou | 25 |
James | ShenZhen | 40 |
在生成了 DataFrame 以後,忽然你發現好像缺失了用戶的性別這個信息,那麼如何添加呢?
若是全部的性別都同樣,咱們能夠經過傳入一個標量,Pandas 會自動幫咱們廣播來填充全部的位置。
user_info["sex"] = "male"
user_info
複製代碼
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Bob | 30 | ShangHai | male |
Mary | 25 | GuangZhou | male |
James | 40 | ShenZhen | male |
若是想要刪除某一列,可使用 pop 方法來完成。
user_info.pop("sex")
user_info
複製代碼
age | city | |
---|---|---|
name | ||
Tom | 18 | BeiJing |
Bob | 30 | ShangHai |
Mary | 25 | GuangZhou |
James | 40 | ShenZhen |
若是用戶的性別不一致的時候,咱們能夠經過傳入一個 like-list 來添加新的一列。
user_info["sex"] = ["male", "male", "female", "male"]
user_info
複製代碼
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Bob | 30 | ShangHai | male |
Mary | 25 | GuangZhou | female |
James | 40 | ShenZhen | male |
經過上面的例子能夠看出,咱們建立新的列的時候都是在原有的 DataFrame 上修改的,也就是說若是添加了新的一列以後,原有的 DataFrame 會發生改變。
若是想要保證原有的 DataFrame 不改變的話,咱們能夠經過 assign 方法來建立新的一列。
user_info.assign(age_add_one = user_info["age"] + 1)
複製代碼
age | city | sex | age_add_one | |
---|---|---|---|---|
name | ||||
Tom | 18 | BeiJing | male | 19 |
Bob | 30 | ShangHai | male | 31 |
Mary | 25 | GuangZhou | female | 26 |
James | 40 | ShenZhen | male | 41 |
user_info.assign(sex_code = np.where(user_info["sex"] == "male", 1, 0))
複製代碼
age | city | sex | sex_code | |
---|---|---|---|---|
name | ||||
Tom | 18 | BeiJing | male | 1 |
Bob | 30 | ShangHai | male | 1 |
Mary | 25 | GuangZhou | female | 0 |
James | 40 | ShenZhen | male | 1 |
想要學習更多關於人工智能的知識,請關注公衆號:AI派
這裏我將整篇文章的內容整理成了pdf,想要pdf文件的能夠在公衆號後臺回覆關鍵字:pandas01。
更多Pandas知識見:輕鬆玩轉Pandas