0Pricing
Pandas & NumPy Academy · 课时

实用的 Series 方法

使用 describe()、value_counts()、unique() 和 map() 快速汇总和转换 Series。

实用的 Series 方法 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

使用 describe() 快速汇总

s.describe() 一次调用即可生成统计摘要:计数、平均值、标准差、最小值、第 25 百分位数(Q1)、中位数(Q2)、第 75 百分位数(Q3)和最大值。对于字符串 Series,它会改为返回计数、唯一值数量、最常见值和频数。在首次探索数据集时,这是快速了解某列分布的最佳方式。

import pandas as pd

ages = pd.Series([25, 32, 19, 45, 28, 31, 22, 40])
print(ages.describe())
# count     8.000000
# mean     30.250000
# std       8.406...
# min      19.000000
# 25%      24.250000
# 50%      29.500000
# 75%      34.750000
# max      45.000000

使用 value_counts() 创建频数表

s.value_counts() 会返回一个新的 Series,其中唯一值作为索引,其出现次数作为数据,并按计数降序排列。传入 normalize=True 可以获取比例而不是原始计数。要了解分类列的分布,首先运行这个方法通常是最合适的做法。

import pandas as pd

colors = pd.Series(['red', 'blue', 'red', 'green', 'blue', 'red'])
print(colors.value_counts())
# red      3
# blue     2
# green    1
print(colors.value_counts(normalize=True).round(2))
# red      0.50  blue  0.33  green  0.17

unique() 和 nunique()

s.unique() 返回一个 NumPy 数组,其中包含按首次出现顺序排列的不同值(而 value_counts 会按频数排序)。s.nunique() 以整数形式返回不同值的数量,即该列的基数。默认情况下,两者都会跳过 NaN。使用 nunique(dropna=False) 可以将 NaN 作为一种不同的值进行计数。

import pandas as pd

s = pd.Series(['apple', 'banana', 'apple', 'cherry', 'banana'])
print(s.unique())    # ['apple' 'banana' 'cherry']
print(s.nunique())   # 3

使用 map() 进行逐元素转换

s.map() 会将函数、字典或另一个 Series 应用于每个元素。传入字典时,每个值都会被对应的字典值替换,而字典中不存在的值会变为 NaN。传入函数时,函数会逐元素应用。map 非常适合重新编码分类标签或应用查找表。

import pandas as pd

grades = pd.Series(['A', 'B', 'C', 'A', 'B'])
gpa = {'A': 4.0, 'B': 3.0, 'C': 2.0}
print(grades.map(gpa))
# 0    4.0
# 1    3.0
# 2    2.0
# 3    4.0
# 4    3.0

使用 apply() 应用自定义函数

s.apply(func) 会对每个元素调用 Python 可调用对象,并收集结果。与 map() 不同,它适用于更复杂的函数,这些函数可能返回非标量对象。对于简单的逐元素转换,优先使用 map() 或向量化表达式;当逻辑过于复杂、无法直接向量化时,再使用 apply()。

import pandas as pd

sentences = pd.Series(['Hello world', 'Pandas is great', 'Data science'])
word_counts = sentences.apply(lambda x: len(x.split()))
print(word_counts)
# 0    2
# 1    3
# 2    2

sort_values() 和 sort_index()

s.sort_values() 会按数据值升序返回排序后的 Series(传入 ascending=False 可改为降序)。s.sort_index() 会按索引标签排序。默认情况下,这两个方法都不会修改原始 Series。传入 inplace=True 可以原地修改 Series,但在现代 Pandas 代码中,通常不太推荐这样做,因为这会降低操作串联的便利性。

import pandas as pd

s = pd.Series([30, 10, 50, 20], index=['d', 'a', 'c', 'b'])
print(s.sort_values())
# a    10
# b    20
# d    30
# c    50
print(s.sort_index())
# a    10
# b    20
# c    50
# d    30

用于成员资格测试的 isin()

s.isin(values) 返回一个布尔 Series:如果元素存在于所提供的列表或集合中,则对应位置为真。与使用多个 | 条件相比,这种写法更易读,并且在集合较大时速度明显更快。它通常用于筛选属于特定组的行,或标记与查找列表匹配的记录。

import pandas as pd

countries = pd.Series(['DE', 'US', 'FR', 'UK', 'US', 'DE'])
nordics = ['DE', 'FR']
print(countries.isin(nordics))
# 0     True  1    False  2     True  3    False  4    False  5     True
print(countries[countries.isin(nordics)])

用于范围筛选的 between()

s.between(left, right, inclusive='both') 返回一个布尔 Series:当值落在范围 [left, right] 内时,对应位置为真。默认情况下,范围两端都包含在内。与编写 (s >= left) & (s <= right) 相比,它更加简洁,也能清楚表达意图。它适用于筛选年龄组或价格区间等数值范围。

import pandas as pd

scores = pd.Series([45, 72, 83, 91, 55, 68])
pass_mask = scores.between(60, 100)
print(pass_mask)
# 0    False  1    True  2    True  3    True  4    False  5    True
print(scores[pass_mask].values)  # [72 83 91 68]

用于快速查看的 head() 和 tail()

s.head(n) 返回前 n 个元素(默认为 5),s.tail(n) 返回最后 n 个元素。在探索数据时,人们经常使用它们来查看较长 Series 的开头和结尾,而不必打印数千行。它们返回一个新的 Series(即切片),因此不会修改原始对象。

import pandas as pd

s = pd.Series(range(100))
print(s.head(3))
# 0    0
# 1    1
# 2    2
print(s.tail(3))
# 97    97
# 98    98
# 99    99

用于更改名称的 rename()

s.rename('new_name') 返回一个新的 Series,其 name 属性已更改。若要重命名索引标签,请传入字典或函数:s.rename(index={'old': 'new'})。在将 Series 合并到 DataFrame 之前,重命名非常重要,因为 Series 的 name 会成为列标题。请始终使用重命名,而不要重新赋值原始值。

import pandas as pd

s = pd.Series([1, 2, 3], index=['a', 'b', 'c'], name='original')
renamed = s.rename('updated').rename(index={'a': 'x', 'b': 'y', 'c': 'z'})
print(renamed)
# x    1
# y    2
# z    3
# Name: updated

idxmin() 和 idxmax()

s.idxmin() 返回最小值对应的索引标签,s.idxmax() 返回最大值对应的标签。当索引包含日期或产品名称等有意义的标签时,这比 argmin/argmax 更实用——您得到的是实际标识符,而不仅仅是位置编号。

import pandas as pd

scores = pd.Series({'Alice': 88, 'Bob': 73, 'Carol': 95, 'Dan': 60})
print('Best:', scores.idxmax(), scores.max())   # Carol 95
print('Worst:', scores.idxmin(), scores.min())  # Dan   60

快速检查

请测试您对本课中实用 Series 方法的理解。

课程回顾

在本课中,您学到了:describe() 一次调用即可提供统计摘要,value_counts() 可以为唯一值构建频数表,以及 map() 使用字典转换值,而 apply() 则对每个元素运行自定义函数。接下来,我们将开始使用 DataFrames——Pandas 数据分析中的二维主力数据结构。

常见问题解答

「实用的 Series 方法」课时是免费的吗?

是的 — 「实用的 Series 方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「实用的 Series 方法」这节课中我会学到什么?

使用 describe()、value_counts()、unique() 和 map() 快速汇总和转换 Series。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「实用的 Series 方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建 Series
  2. 基于标签与基于位置的访问
  3. Series 上的向量化运算
  4. 实用的 Series 方法
← 返回 Pandas & NumPy Academy