第1篇:初识pandas与Series

教程文档和源码已上传至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两大核心数据结构:SeriesDataFrame

维数 名称 描述 数据表
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(参数),参数如下:
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,继续加油,相信你学完这两种数据结构,将来无论面对如何复杂的情形,都会处乱不惊,心态就一个字:稳。


文章作者: 张亚飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张亚飞 !
评论
 上一篇
第24篇:http编程 第24篇:http编程
一、web工作流程 Web服务器的工作原理可以简单地归纳为 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言
2021-01-07
下一篇 
第23篇:socket编程 第23篇:socket编程
一、互联网协议介绍互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里
2021-01-06
  目录