教程文档和源码已上传至git仓库:https://gitee.com/zhangyafeii/easy-pandas
第1部分:pandas概览
pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,pandas 离这个目标已经越来越近了。
pandas 适用于处理以下类型的数据:
- 与 SQL 或 Excel 表类似的,含异构列的表格数据;
- 有序和无序(非固定频率)的时间序列数据;
- 带行列标签的矩阵数据,包括同构或异构型数据;
- 任意其它形式的观测、统计数据集, 数据转入 pandas 数据结构时不必事先标记。
pandas 的主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。对于 R 用户,DataFrame 提供了比 R 语言 data.frame 更丰富的功能。pandas 基于 NumPy 开发,可以与其它第三方科学计算支持库完美集成。
pandas 就像一把万能瑞士军刀,下面仅列出了它的部分优势:
- 处理浮点与非浮点数据里的缺失数据,表示为 NaN;
- 大小可变:插入或删除 DataFrame 等多维对象的列;
- 自动、显式数据对齐:显式地将对象与一组标签对齐,也可以忽略标签,在 Series、DataFrame 计算时自动与数据对齐;
- 强大、灵活的分组(group by)功能:拆分-应用-组合数据集,聚合、转换数据;
- 把 Python 和 NumPy 数据结构里不规则、不同索引的数据轻松地转换为 DataFrame 对象;
- 基于智能标签,对大型数据集进行切片、花式索引、子集分解等操作;
- 直观地合并(merge)、连接(join)数据集;
- 灵活地重塑(reshape)、透视(pivot)数据集;
- 轴支持结构化标签:一个刻度支持多个标签;
- 成熟的 IO 工具:读取文本文件(CSV 等支持分隔符的文件)、Excel 文件、数据库等来源的数据,利用超快的 HDF5 格式保存 / 加载数据;
- 时间序列:支持日期范围生成、频率转换、移动窗口统计、移动窗口线性回归、日期位移等时间序列功能。
这些功能主要是为了解决其它编程语言、科研环境的痛点。处理数据一般分为几个阶段:数据整理与清洗、数据分析与建模、数据可视化与制表,pandas 是处理数据的理想工具。
其它说明:
- pandas 速度很快。pandas 的很多底层算法都用 Cython 优化过。然而,为了保持通用性,必然要牺牲一些性能,如果专注某一功能,完全可以开发出比 pandas 更快的专用工具。
- pandas 是 statsmodels 的依赖项,因此,pandas 也是 Python 中统计计算生态系统的重要组成部分。
- pandas 已广泛应用于金融领域。
第2部分:数据结构
pandas两大核心数据结构:Series和DataFrame。
| 维数 | 名称 | 描述 | 数据表 |
|---|---|---|---|
| 1 | Series | 带标签的一维同构数组 | 一列或一行 |
| 2 | DataFrame | 带标签的,大小可变的,二维异构表 | 一个sheet表或一个table |
- Series是一种一维数据结构,每一个元素都带有一个索引,其中索引可以为数字或字符串。其基本数据结构为索引列和数据列。
- Dataframe是一种二维数据结构,数据以表格形式(与excel类似)存储,有对应的行和列。其基本数据结构为索引列和多列数据,即Dataframe的由多个Series构成。
pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。
此外,通用 API 函数的默认操作要顾及时间序列与截面数据集的方向。多维数组存储二维或三维数据时,编写函数要注意数据集的方向,这对用户来说是一种负担;如果不考虑 C 或 Fortran 中连续性对性能的影响,一般情况下,不同的轴在程序里其实没有什么区别。pandas 里,轴的概念主要是为了给数据赋予更直观的语义,即用“更恰当”的方式表示数据集的方向。这样做可以让用户编写数据转换函数时,少费点脑子。
处理 DataFrame 等表格数据时,index(行)或 columns(列)比 axis 0 和 axis 1 更直观。用这种方式迭代 DataFrame 的列,代码更易读易懂:
大小可变和数据复制
pandas 所有数据结构的值都是可变的,但数据结构的大小并非都是可变的,比如,Series 的长度不可改变,但 DataFrame 里就可以插入列。
pandas 里,绝大多数方法都不改变原始的输入数据,而是复制数据,生成新的对象。 一般来说,原始输入数据不变更稳妥。
相关模块导入
import pandas as pd
import numpy as np
查看pandas版本
pd.__version__
'1.1.3'
构建一个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 |
type(user_info) # pandas.core.frame.DataFrame
pandas.core.frame.DataFrame
查看某列数据及其类型
user_info.age
name
Tom 18
Bob 30
Mary 25
James 40
Name: age, dtype: int64
type(user_info.age) # pandas.core.series.Series
pandas.core.series.Series
查看某行数据及其类型
user_info.loc['Tom', :]
age 18
city BeiJing
Name: Tom, dtype: object
type(user_info.loc['Tom', :]) # pandas.core.series.Series
pandas.core.series.Series
第3部分:Series
Series是一个带有名称和索引的一维数组,但与传统数组中元素类型必须相同不一样的是,Series中的元素类型可以不同,在Series中包含的数据类型可以是整数、浮点、字符串、Python对象等,这一点与Python中的列表比较类似,但与列表不同的是,列表只能通过数字索引取值,而Series可以通过自定义索引取值,从这一点来看Series与字典类似。
pandas.Series(data=None, index=None, dtype=None, name=None, copy=False)
参数解释:
- data:支持以下数据类型:
- Python 字典
- 多维数组
- 标量值(如,5)
- index:索引,类似数组或列表,值必须是可哈希的,并且与“data”具有相同的长度。允许使用非唯一索引值。将默认为RangeIndex(0,1,2,…,n)(如果未提供)。如果Index和字典同时提供,index将会覆盖字典的keys。
- dtype: str,numpy.d类型,或ExtensionType,可选输出序列的数据类型。如果未指定,则将从“data”推断。
- name:Series的名称。
- copy: bool,默认为False,是否对输入数据进行复制。
1. Series的创建
方式一:通过列表或数组方式创建
user_age = pd.Series(data=[18, 30, 25, 40])
user_age
0 18
1 30
2 25
3 40
dtype: int64
user_age.index = ["Tom", "Bob", "Mary", "James"] # 加索引
user_age.index.name = "name" # 索引加名字
user_age.name="user_age_info" # series加名字
user_age
name
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
user_age = pd.Series(data=[18, 30, 25, 40], index=["Tom", "Bob", "Mary", "James"], name='user_age_info')
user_age
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
方式二:通过字典方式创建
data = {"Tom": 18, "Bob": 30, "Mary": 25, "James": 40}
user_age = pd.Series(data=data, name="user_age_info")
user_age
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
注意:data 为字典,且未设置 index 参数时,如果 Python 版本 >= 3.6 且 pandas 版本 >= 0.23,Series 按字典的插入顺序排序索引。
Python < 3.6 或 pandas < 0.23,且未设置 index 参数时,Series 按字母顺序排序字典的键(key)列表。
手动指定数据类型
data = {"Tom": 18, "Bob": 30, "Mary": 25, "James": 40}
user_age = pd.Series(data=data, name="user_age_info", dtype=float)
user_age
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Name: user_age_info, dtype: float64
方式三:通过标量值创建
data 是标量值时,必须提供索引。Series 按索引长度重复该标量值。
pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
查看Series所有属性和方法
[attr for attr in dir(user_age) if not attr.startswith('_')]
['Bob',
'James',
'Mary',
'T',
'Tom',
'abs',
'add',
'add_prefix',
'add_suffix',
'agg',
...
]
2. Series属性
Series常见的属性包含:
- shape: Series的形状
- index: Series的索引
- values: Series的数据值。ndarray类型
- name: Series的名称
- dtype: Series的数据类型
user_age.shape
(4,)
user_age.index
Index(['Tom', 'Bob', 'Mary', 'James'], dtype='object')
user_age.values
array([18., 30., 25., 40.])
user_age.name
'user_age_info'
user_age.dtype
dtype('float64')
对于一个Series,其中最常用的属性为值(values),索引(index),名字(name),类型(dtype)。
3. Series的方法
3.1 基本方法
- head(n): 查看Series的前n个元素,默认n为5。
- tail(n): 查看Series的后n个元素,默认n为5。
- unique(): 返回Series中不重复的元素。
- nunique(dropna=False):返回Series中不重复的元素个数。
- isna(): 判断元素是否是缺失值。
- isnull(): 和isna()功能相同。
- dropna(inplace=False):删除缺失值。
- isin(values):成员运算,values为set或者list-like类型,判断series中每个元素是否是values的成员。
- sort_index(ascending=False, inplace=False): 对索引排序
- sort_values(ascending=False, inplace=False):对值排序。
- idmax(): 返回最大值的索引。
- idmin(): 返回最小值的索引。
- nlargest(): 返回n个最大的值。
- nsmallest(): 返回n个最小的值。
- count(): 返回非缺失值元素个数。
- value_counts(ascending=False,dropna=True):统计数据频率。
- clip(lower, upper, inplace=False): 对Series在lower-upper范围进行截断,小于lower的替换为lower,大于upper的替换为upper。
- replace(to_replace, value=None, inplace=False): 对Series中指定值进行替换。
- where(cond, other=np.nan, inplace=False): 对不满足cond的元素替换为other。
- add_prefix(prefix): 统一加前缀。
- add_suffix(suffix): 统一加后缀。
- reset_index(drop=False, name=None, inplace=False): 重置索引,当drop为False时返回DataFrame。
- to_frame(name=None):将Series转换为DataFrame。
- append(to_append, ignore_index=False, verify_integrity=False):将两个Series进行合并。
创建数据表
user_age = pd.Series(data=[18, 30, 25, 40, 81, 40, None], index=["Tom", "Bob", "Mary", "James", "Kobe", "Ming", "Rose"], name='user_age_info')
user_age
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Rose NaN
Name: user_age_info, dtype: float64
3.1.1 查看前(后)n个元素
查看前5个元素
user_age.head()
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Name: user_age_info, dtype: float64
查看后5个元素
user_age.tail()
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Rose NaN
Name: user_age_info, dtype: float64
指定查看个数
user_age.head(3)
Tom 18.0
Bob 30.0
Mary 25.0
Name: user_age_info, dtype: float64
user_age.tail(3)
Kobe 81.0
Ming 40.0
Rose NaN
Name: user_age_info, dtype: float64
3.1.2 查看数据的基本信息
user_age.describe() # 查看Series基本统计信息
count 6.000000
mean 39.000000
std 22.289011
min 18.000000
25% 26.250000
50% 35.000000
75% 40.000000
max 81.000000
Name: user_age_info, dtype: float64
user_age.describe(percentiles=[.05, .25, .75, .95]) # 可以自己选择分位数
count 6.000000
mean 39.000000
std 22.289011
min 18.000000
5% 19.750000
25% 26.250000
50% 35.000000
75% 40.000000
95% 70.750000
max 81.000000
Name: user_age_info, dtype: float64
user_age.count() # 查看非缺失值元素个数
6
3.1.3 数据去重
查看所有用户不重复的年龄
user_age.unique()
array([18., 30., 25., 40., 81., nan])
查看所有用户不重复的年龄个数
user_age.nunique() # 默认不包含缺失值
5
user_age.nunique(dropna=False) # 包含缺失值
6
3.1.4 删除缺失值
user_age.isna() # 查看元素是否是缺失值
# user_age.isnull()
Tom False
Bob False
Mary False
James False
Kobe False
Ming False
Rose True
Name: user_age_info, dtype: bool
user_age.dropna() # 删除缺失值,返回删除后的结果
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Name: user_age_info, dtype: float64
user_age # 默认不修改原始数据
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Rose NaN
Name: user_age_info, dtype: float64
user_age.dropna(inplace=True) # 在原始数据的基础上删除缺失值,可以设置inplace参数为True
user_age
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Name: user_age_info, dtype: float64
3.1.5 成员运算
查看用户的年龄是否小于60
user_age.isin(list(range(60)))
Tom True
Bob True
Mary True
James True
Kobe False
Ming True
Name: user_age_info, dtype: bool
3.1.6 排序
对用户名进行排序
user_age.sort_index() # 默认升序,从小到大
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
user_age.sort_index(ascending=False) # 逆序
Tom 18.0
Ming 40.0
Mary 25.0
Kobe 81.0
James 40.0
Bob 30.0
Name: user_age_info, dtype: float64
user_age # 原始数据并未修改
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Kobe 81.0
Ming 40.0
Name: user_age_info, dtype: float64
user_age.sort_index(inplace=True) # 修改原始数据
user_age
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
对年龄进行排序
user_age.sort_values() # 默认升序,从小到大
Tom 18.0
Mary 25.0
Bob 30.0
James 40.0
Ming 40.0
Kobe 81.0
Name: user_age_info, dtype: float64
user_age.sort_values(ascending=False)
Kobe 81.0
Ming 40.0
James 40.0
Bob 30.0
Mary 25.0
Tom 18.0
Name: user_age_info, dtype: float64
3.1.7 统计数据频率
user_age
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
user_age.value_counts() # 不包含缺失值
40.0 2
18.0 1
25.0 1
81.0 1
30.0 1
Name: user_age_info, dtype: int64
user_age.count() # 查看非缺失值个数
6
3.1.8 获取最大(小)值及其索引
idxmax函数返回最大值所在索引,当存在多个最大值时,返回第一个最大值的索引,idxmin功能类似
user_age.idxmax()
'Kobe'
nlargest函数返回前几个大的元素值,nsmallest功能类似
user_age.nlargest()
Kobe 81.0
James 40.0
Ming 40.0
Bob 30.0
Mary 25.0
Name: user_age_info, dtype: float64
user_age.nlargest(3)
Kobe 81.0
James 40.0
Ming 40.0
Name: user_age_info, dtype: float64
user_age
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
3.1.9 对元素值进行替换
clip是对超过或者低于某些值的数进行截断和补齐
user_age.clip(20,40)
Bob 30.0
James 40.0
Kobe 40.0
Mary 25.0
Ming 40.0
Tom 20.0
Name: user_age_info, dtype: float64
replace是对某些值进行替换
user_age.replace(20, 30)
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
user_age.replace([18, 20], [25, 30])
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 25.0
Name: user_age_info, dtype: float64
user_age.replace({18: 25, 20: 30})
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 25.0
Name: user_age_info, dtype: float64
where 将不满足条件的元素替换为指定值,默认为np.nan
user_age.where(user_age > 30)
Bob NaN
James 40.0
Kobe 81.0
Mary NaN
Ming 40.0
Tom NaN
Name: user_age_info, dtype: float64
user_age.where(user_age > 30, 30)
Bob 30.0
James 40.0
Kobe 81.0
Mary 30.0
Ming 40.0
Tom 30.0
Name: user_age_info, dtype: float64
3.1.10 应用函数 /元素迭代
user_age.add(1)
Bob 31.0
James 41.0
Kobe 82.0
Mary 26.0
Ming 41.0
Tom 19.0
Name: user_age_info, dtype: float64
user_age + 1
Bob 31.0
James 41.0
Kobe 82.0
Mary 26.0
Ming 41.0
Tom 19.0
Name: user_age_info, dtype: float64
user_age.apply(lambda x: x + 1)
Bob 31.0
James 41.0
Kobe 82.0
Mary 26.0
Ming 41.0
Tom 19.0
Name: user_age_info, dtype: float64
user_age.apply(lambda x: x % 7 + 1)
Bob 3.0
James 6.0
Kobe 5.0
Mary 5.0
Ming 6.0
Tom 5.0
Name: user_age_info, dtype: float64
3.1.11 统一添加前/后缀
user_age.add_prefix('user-')
user-Bob 30.0
user-James 40.0
user-Kobe 81.0
user-Mary 25.0
user-Ming 40.0
user-Tom 18.0
Name: user_age_info, dtype: float64
user_age.add_suffix('-age')
Bob-age 30.0
James-age 40.0
Kobe-age 81.0
Mary-age 25.0
Ming-age 40.0
Tom-age 18.0
Name: user_age_info, dtype: float64
3.1.12 Series转为DataFrame
# 方法1:重置索引,索引转换为新的一列,默认列名为index
user_age.reset_index()
| index | user_age_info | |
|---|---|---|
| 0 | Bob | 30.0 |
| 1 | James | 40.0 |
| 2 | Kobe | 81.0 |
| 3 | Mary | 25.0 |
| 4 | Ming | 40.0 |
| 5 | Tom | 18.0 |
# 方式2:to_frame
user_age.to_frame()
| user_age_info | |
|---|---|
| Bob | 30.0 |
| James | 40.0 |
| Kobe | 81.0 |
| Mary | 25.0 |
| Ming | 40.0 |
| Tom | 18.0 |
3.1.13 Series合并
user_age
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
user_age2 = pd.Series(data={"张三": 21, "李四": 30, "王五": 40}, name="user_age_info2", dtype=float)
user_age2
张三 21.0
李四 30.0
王五 40.0
Name: user_age_info2, dtype: float64
user_age.append(user_age2) # 返回合并之后的Series
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
张三 21.0
李四 30.0
王五 40.0
dtype: float64
user_age # 不修改自身
Bob 30.0
James 40.0
Kobe 81.0
Mary 25.0
Ming 40.0
Tom 18.0
Name: user_age_info, dtype: float64
3.2 数字类型方法
- max(): 最大值
- min(): 最小值
- sum(): 和
- var(): 方差
- std(): 标准差
- median(): 中位数
- mean(): 平均值
- mad(): 平均绝对偏差,每个数据点与平均值之间的平均距离。
- abs(): 绝对值
- quantile(): 分位数函数
- cummax(): 累计最大值
- cumsum(): 累计和
- cumprod(): 累计乘积
user_age.max() # 最大值
81.0
user_age.min() # 最小值
18.0
user_age.sum() # 和
234.0
user_age.var() # 方差
496.8
user_age.std() # 标准差
22.289010745208053
user_age.median() # 中位数
35.0
user_age.mean() # 平均值
39.0
user_age.mad() # 平均绝对偏差
14.666666666666666
user_age.quantile() # 默认q=0.5
35.0
user_age.quantile(0.25) # 指定q
26.25
user_age.cummax() # 累计最大值
Bob 30.0
James 40.0
Kobe 81.0
Mary 81.0
Ming 81.0
Tom 81.0
Name: user_age_info, dtype: float64
user_age.cummin() # 累计最小值
Bob 30.0
James 30.0
Kobe 30.0
Mary 25.0
Ming 25.0
Tom 18.0
Name: user_age_info, dtype: float64
user_age.cumsum() # 累计和
Bob 30.0
James 70.0
Kobe 151.0
Mary 176.0
Ming 216.0
Tom 234.0
Name: user_age_info, dtype: float64
user_age.cumprod() # 连乘积
Bob 3.000000e+01
James 1.200000e+03
Kobe 9.720000e+04
Mary 2.430000e+06
Ming 9.720000e+07
Tom 1.749600e+09
Name: user_age_info, dtype: float64
3.3 字符串类型方法
pandas中字符串类型Series通过Series.str.方法进行调用,常用的方法如下:

通过以上我们可以知道,pandas中字符串Series几乎具有Python字符串所有的功能,从这里就可以看出pandas的强大之处了。
关于字符串类型的方法,我们将在之后文本数据处理章节中进行介绍。
3.4 分类数据方法
分类数据直白来说就是取值为有限的,或者说是固定数量的可能值。例如:性别、血型,通过Series.cat.方法名来调用。具体使用将在后面分类数据处理章节进行详细介绍。
3.5 时间序列数据方法
关于时间数据类型,pandas中也对其有针对性的处理方法。时间数据类型通过Series.dt.方法名来调用。具体使用将在后面时间数据处理章节进行详细介绍。
3.6 画图
Series.plot(参数),参数如下:
官方文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plot.html
4. Series的增删改查
4.1 访问数据元素
访问Series数据元素有3种方式:
- 索引
- 序号
- 布尔
创建一个Series
name = pd.Index(["Tom", "Bob", "Mary", "James"], name="name")
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
按索引查找
按索引查找单个指定元素
user_age.Tom # 点访问属性
18
user_age['Tom'] # 取索引值为Tom的元素
18
user_age.get('Tom')
18
# user_age['Kobe'] # 会报错
user_age.get('Kobe') # get方式不会报错
user_age.get('Kobe', default=30) # 不存在的key可以设置默认值b
30
按索引数组查找多个元素
user_age[['Tom', 'James']]
name
Tom 18
James 40
Name: user_age_info, dtype: int64
user_age
name
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
按序号查找
按序号查找指定元素
user_age[0] # 第一个元素
18
按序号数组查找多个元素
user_age[[1,3]] # 查找序号为1和3的数据元素
name
Bob 30
James 40
Name: user_age_info, dtype: int64
按序号切片查找多个元素
user_age[:3] # 查找前3个元素,即序号为0,1,2的元素
name
Tom 18
Bob 30
Mary 25
Name: user_age_info, dtype: int64
布尔查找
user_age[user_age > 30] # 查找所有年龄大于30的元素
name
James 40
Name: user_age_info, dtype: int64
4.2 添加数据元素
pandas中添加数据元素的方法与字典类似,可以直接通过[索引] = value进行添加。如果想要添加多个元素,可以将其转换为Series,采用上面介绍的append方法对其进行合并。
user_age
name
Tom 18
Bob 30
Mary 25
James 40
Name: user_age_info, dtype: int64
user_age['Wade'] = 39
user_age['Michael'] = 50
user_age
name
Tom 18
Bob 30
Mary 25
James 40
Wade 39
Michael 50
Name: user_age_info, dtype: int64
4.3 修改数据元素
pandas的Series对数据元素进行修改,可以直接使用Series[索引/序号] = new_valuezip样的方式。
user_age['Wade'] = 38 # 按索引修改
user_age
name
Tom 18
Bob 30
Mary 25
James 40
Wade 38
Michael 50
Name: user_age_info, dtype: int64
user_age[1]
30
user_age[1] = 35 # 按序号修改
user_age
name
Tom 18
Bob 35
Mary 25
James 40
Wade 38
Michael 50
Name: user_age_info, dtype: int64
4.4 删除数据元素
pandas中想要删除Series的数据元素,我们可以采用del Series[索引]这样的方法,当然,也可以使用内置的drop方法对其进行删除。
del user_age['Wade']
user_age
name
Tom 18
Bob 35
Mary 25
James 40
Michael 50
Name: user_age_info, dtype: int64
user_age.drop('Michael') # 不会改变原始数据
name
Tom 18
Bob 35
Mary 25
James 40
Name: user_age_info, dtype: int64
user_age
name
Tom 18
Bob 35
Mary 25
James 40
Michael 50
Name: user_age_info, dtype: int64
user_age.drop('Michael', inplace=True) # 改变原始数据
user_age
name
Tom 18
Bob 35
Mary 25
James 40
Name: user_age_info, dtype: int64
user_age.drop(['Tom', 'Bob'], inplace=True) # 一次性删除多个元素
user_age
name
Mary 25
James 40
Name: user_age_info, dtype: int64
简单小结
本节内容到这里就结束了,本节第1部分首先带大家了解了pandas的主要应用场景及特点;第2部分主要介绍了pandas的两种基本数据结构,Series和DataFram的特点及基本使用方法。第3部分针对Series这种数据结构进行详细的介绍,分别从Series的创建、属性、方法和增删改查四个方面进行说明。如果你认真学习了以上内容,相信你已经对pandas有了一个初步的了解,并已经掌握了Series的基本使用。下一节将介绍pandas第二大数据结构DataFrame,继续加油,相信你学完这两种数据结构,将来无论面对如何复杂的情形,都会处乱不惊,心态就一个字:稳。