Pandas數據結構詳解 | 輕鬆玩轉Pandas(1)

教你學會 Pandas 不是個人目的,教你輕鬆玩轉 Pandas 纔是個人目的。我會經過一系列實例來帶入 Pandas 的知識點,讓你在學習 Pandas 的路上再也不枯燥。html

聲明:我所寫的輕鬆玩轉 Pandas 教程都是免費的,若是對你有幫助,你能夠持續關注我。python

Pandas 有不少高級的功能,可是想要掌握高級功能前,須要先掌握它的基礎知識,Pandas 中的數據結構算是很是基礎的知識之一了。數據庫

Pandas 經常使用的數據結構有兩種:Series 和 DataFrame。這些數據結構構建在 Numpy 數組之上,這意味着它們效率很高。咱們來分別看看這些數據結構都長什麼樣子吧。數組

# 導入相關庫
import numpy as np
import pandas as pd
複製代碼

Series

簡介

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 像什麼

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 的向量化操做

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

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派

qrcode_for_gh_60cef389e81c_258.jpg

這裏我將整篇文章的內容整理成了pdf,想要pdf文件的能夠在公衆號後臺回覆關鍵字:pandas01

更多Pandas知識見:輕鬆玩轉Pandas

相關文章
相關標籤/搜索