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

相关文章
相关标签/搜索