看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本文介绍的是 pandas 类中 Series 的初始化方法 __init__()
的功能。pd.Series() 函数可以帮助我们构造一个 Series 对象,然后我们再对 Series 进行后续操作。
Series 是一个带标签的一维数组,能够保存任何数据类型(整数、字符串、浮点数、Python 对象等)。 轴标签统称为索引。
pd.Series() 是 Series 类的构造方法:
class pandas.Series(
data=None,
index=None,
dtype: Dtype | None = None,
name=None,
copy: bool = False,
fastpath: bool = False,
)
它会初始化一个 Series 对象。
参数如下:
RangeIndex (0, 1, 2, ..., n)
,它是从 0 开始的自然索引Series 是带有轴标签(包括时间序列)的一维 ndarray。 特点有:
+、-、/、*、**
)根据它们关联的索引值对齐值,同时它们不必是相同的长度(参考 NumPy 的广播)。更多示例可以参考 pandas 序列 Series。以下为一些简单示例。
从具有指定索引的字典构造 Series:
d = {'a': 1, 'b': 2, 'c': 3}
ser = pd.Series(data=d, index=['a', 'b', 'c'])
ser
'''
a 1
b 2
c 3
dtype: int64
'''
字典的键与索引值匹配,因此索引值无效。
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> ser = pd.Series(data=d, index=['x', 'y', 'z'])
>>> ser
x NaN
y NaN
z NaN
dtype: float64
请注意,索引首先使用字典中的键构建。 在此之后,Series 使用给定的 Index 值重新索引,因此我们得到所有 NaN 作为结果。
从带有 copy=False
的列表构造 Series。
r = [1, 2]
ser = pd.Series(r, copy=False)
ser.iloc[0] = 999
r
# [1, 2]
ser
'''
0 999
1 2
dtype: int64
'''
由于输入数据类型,即使 copy=False
,Series 也有原始数据的 copy
,所以数据没有改变。
从 copy=False
的 1d ndarray 构造系列。
r = np.array([1, 2])
ser = pd.Series(r, copy=False)
ser.iloc[0] = 999
r
# array([999, 2])
ser
'''
0 999
1 2
dtype: int64
'''
由于输入 Series 的数据类型,对原始数据有一个「视图」,因此数据也发生了变化。
数据(data 参数)可以是许多不同的东西:
传递的索引是轴标签的列表。 因此,根据数据是什么,这分为几种情况:
如果 data 是 ndarray,则 index 必须与 data 的长度相同。 如果没有传递索引,则将创建一个具有值 [0, ..., len(data) - 1] 的索引。
s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
s
'''
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 1.212112
dtype: float64
'''
s.index
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
pd.Series(np.random.randn(5))
'''
0 -0.173215
1 0.119209
2 -1.044236
3 -0.861849
4 -2.104569
dtype: float64
'''
pandas 支持非唯一索引值。 如果尝试不支持重复索引值的操作,则此时将引发异常。 懒惰的原因几乎都是基于性能的(计算中有很多实例,比如 GroupBy 的部分,没有使用索引)。
Series 可以从 dicts 实例化:
d = {"b": 1, "a": 0, "c": 2}
pd.Series(d)
'''
b 1
a 0
c 2
dtype: int64
'''
当数据是 dict,并且没有传递索引时,如果您使用 Python 版本 >= 3.6 和 pandas 版本 >= 0.23,则 Series 索引将按 dict 的插入顺序排序。
如果您使用 Python < 3.6 或 pandas < 0.23,并且未传递索引,则 Series 索引将是 dict 键的词法排序列表。
在上面的示例中,如果您使用的是低于 3.6 的 Python 版本或低于 0.23 的 pandas 版本,则 Series 将按 dict 键的词法顺序排序(即 ['a', 'b', 'c' ] 而不是 ['b', 'a', 'c'])。
如果传递了索引,则将索引中标签对应的数据中的值拉出。
d = {"a": 0.0, "b": 1.0, "c": 2.0}
pd.Series(d)
'''
Out[10]:
a 0.0
b 1.0
c 2.0
dtype: float64
'''
pd.Series(d, index=["b", "c", "d", "a"])
'''
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
'''
NaN(不是数字)是 pandas 中使用的标准缺失数据标记。
如果数据是标量值,则必须提供索引。该值将重复以匹配索引的长度。
pd.Series(5.0, index=["a", "b", "c", "d", "e"])
'''
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
'''
系列类似于 ndarray,是一个 ndarray-like。
Series 的行为与 ndarray 非常相似,并且是大多数 NumPy 函数的有效参数。但是,切片等操作也会对索引进行操作。
s[0]
# 0.4691122999071863
s[:3]
'''
a 0.469112
b -0.282863
c -1.509059
dtype: float64
'''
s[s > s.median()]
'''
a 0.469112
e 1.212112
dtype: float64
'''
s[[4, 3, 1]]
'''
e 1.212112
d -1.135632
b -0.282863
dtype: float64
'''
np.exp(s)
'''
a 1.598575
b 0.753623
c 0.221118
d 0.321219
e 3.360575
dtype: float64
'''
也支持基于数组的索引,如 s[[4, 3, 1]]。
与 NumPy 数组一样,pandas Series 也有 dtype。
s.dtype
# dtype('float64')
这通常是 NumPy dtype。 但是,pandas 和 3rd-party 库在一些地方扩展了 NumPy 的类型系统,在这种情况下,dtype 将是 ExtensionDtype。 pandas 中的一些示例是分类数据和 Nullable 整数数据类型。
如果您需要支持 Series 的实际数组,请使用 Series.array。
s.array
'''
<PandasArray>
[ 0.4691122999071863, -0.2828633443286633, -1.5090585031735124,
-1.1356323710171934, 1.2121120250208506]
Length: 5, dtype: float64
'''
当您需要在没有索引的情况下执行某些操作(例如,禁用自动对齐)时,访问数组会很有用。
Series.array 将始终是 ExtensionArray。 简而言之,ExtensionArray 是一个或多个具体数组(如 numpy.ndarray)的简易包装器。 pandas 知道如何获取 ExtensionArray 并将其存储在 Series 或 DataFrame 的列中。
虽然 Series 类似于 ndarray,但如果您需要实际的 ndarray,请使用 Series.to_numpy()。
s.to_numpy()
# array([ 0.4691, -0.2829, -1.5091, -1.1356, 1.2121])
即使 Series 由 ExtensionArray 支持,Series.to_numpy() 也会返回 NumPy ndarray。
Series 就像一个固定大小的 dict,您可以通过索引标签获取和设置值:
s["a"]
# 0.4691122999071863
s["e"] = 12.0
s
'''
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 12.000000
dtype: float64
'''
"e" in s
# True
"f" in s
# False
如果不包含标签,则会引发异常:
s["f"]
# 'f'
使用 get 方法,缺少的标签将返回 None 或指定的默认值:
s.get("f")
s.get("f", np.nan)
# nan
属性访问非常方便。您可以直接访问 Series 上的索引作为属性:
sa = pd.Series([1, 2, 3], index=list('abc'))
sa.b
# 2
sa.a = 5
sa
'''
a 5
b 2
c 3
dtype: int64
'''
向量化操作和标签对齐 Series。
使用原始 NumPy 数组时,通常不需要逐个值循环。 在 pandas 中使用 Series 时也是如此。 Series 也可以传递给大多数需要 ndarray 的 NumPy 方法。
s + s
'''
a 0.938225
b -0.565727
c -3.018117
d -2.271265
e 24.000000
dtype: float64
'''
s * 2
'''
a 0.938225
b -0.565727
c -3.018117
d -2.271265
e 24.000000
dtype: float64
'''
np.exp(s)
'''
a 1.598575
b 0.753623
c 0.221118
d 0.321219
e 162754.791419
dtype: float64
'''
Series 和 ndarray 之间的一个关键区别是 Series 之间的操作会根据标签自动对齐数据。 因此,您可以编写计算而不考虑所涉及的系列是否具有相同的标签。
s[1:] + s[:-1]
'''
a NaN
b -0.565727
c -3.018117
d -2.271265
e NaN
dtype: float64
'''
未对齐 Series 之间的操作结果将包含所涉及的索引的并集。 如果在一个系列或另一个 Series 中找不到标签,则结果将被标记为缺失 NaN。 无需进行任何明确的数据对齐即可编写代码,这为交互式数据分析和研究提供了极大的自由度和灵活性。 pandas 数据结构的集成数据对齐功能使 pandas 有别于大多数用于处理标记数据的相关工具。
通常,我们选择使不同索引对象之间的操作的默认结果产生索引的并集,以避免信息丢失。 尽管缺少数据,但具有索引标签通常是作为计算的一部分的重要信息。 您当然可以选择通过 dropna 函数删除缺少数据的标签。
系列也可以有一个 name 属性:
s = pd.Series(np.random.randn(5), name="something")
s
'''
0 -0.494929
1 1.071804
2 0.721555
3 -0.706771
4 -1.039575
Name: something, dtype: float64
'''
s.name
# 'something'
在许多情况下,Series name 将被自动指定,特别是在获取 DataFrame 的 1D 切片时。
您可以使用 pandas.Series.rename() 方法重命名系列。
s2 = s.rename("different")
s2.name
# 'different'
请注意,s 和 s2 指的是不同的对象。
更新时间:2022-06-25 00:02:32 标签:pandas series