Pandas 有很多高级的功能,但是想要掌握高级功能前,需要先掌握它的基础知识,Pandas 中的数据结构算是非常基础的知识之一了。 Pandas 常用的数据结构有两种:Series 和 DataFrame。这些数据结构构建在 Numpy 数组之上,这意味着它们效率很高。我们来分别看看这些数据结构都长什么样子吧。
# 导入相关库
import numpy as np
import pandas as pd
提示没有该库,可以pip安装
ipython下来运行
# 存储了 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 中了,你可能会想,单独存储了年龄有什么用,我怎么知道这个年龄属于哪个用户呢?
user_age.index = ["Tom", "Bob", "Mary", "James"]
user_age
-------------------
Tom 18
Bob 30
Mary 25
James 40
dtype: int64
你看,现在姓名与年龄已经完全对应上了。虽然说我们自己知道 Tom/Bob 这些是姓名,但是别人不知道啊,我们怎么告诉他人呢?
user_age.index.name = "name"
user_age
-------------------
name
Tom 18
Bob 30
Mary 25
James 40
dtype: int64
可能你还会想,如果别人在看我写的代码,怎么能快速的知道我这写的到底是什么玩意呢?
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
# 获取 Tom 的年龄
user_age["Tom"]
-------------------
18.0
user_age.get("Tom")
-------------------
18.0
# 获取第一个元素
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。
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 实现呢?
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 的索引是用户性别,还有两列分别是用户的年龄和城市信息。
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 的信息,我该如何操作呢?
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
如果所有的性别都一样,我们可以通过传入一个标量,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
user_info.pop("sex")
---------------------
name
Tom male
Bob male
Mary male
James male
Name: sex, dtype: object
---------------------
user_info
---------------------
age city
name
Tom 18 BeiJing
Bob 30 ShangHai
Mary 25 GuangZhou
James 40 ShenZhen
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 会发生改变。
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
本文作者为王伟同学-程序人生,转载请注明。