关于Pandas版本: 本文基于 pandas2.2.0 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
传送门: Pandas API参考目录
传送门: Pandas 版本更新及新特性
传送门: Pandas 由浅入深系列教程
本节目录
- Pandas.Series.clip()
- 语法:
- 返回值:
- 参数说明:
- lower 最小边界
- upper 最大边界
- axis 指定修剪方向(行或列)
- inplace 原地修改正
- 相关方法:
- 示例:
- 例1:小于最小边界的数据值,修剪为边界值
- 例2:传递 `array-like` 的各种注意事项
- 例3: `lower` 参数可以和 `upper` 参数一起使用
- 例4:在原数据里直接修剪
Pandas.Series.clip()
Pandas.Series.clip
根据指定的边界,修剪数据的最大最小范围。
- 若指定了最小边界
lower
,沿轴数据中比lower
小的值,会被替换为lower
。 - 若指定了最大边界
upper
,沿轴数据中比upper
大的值,会被替换为upper
。
语法:
Series.clip(lower=None, upper=None, *, axis=None, inplace=False, **kwargs)
返回值:
-
Series or Series or None
- 返回类型与调用者一致,若
inplace=True
则返回None
。
- 返回类型与调用者一致,若
参数说明:
lower 最小边界
-
lower : float or array-like, default None >
lower
参数,用于指定数据的最小边界,数据中比lower
小的值,会被替换为lower
,默认lower=None
表示不限制最小边界:lower
参数可以和upper
参数一起使用。 例3- float: 指定一个浮点数(整数也行),作为最小边界。例1
- array-like: 指定一个 array-like 作为最小边界。这可以做到按指定位置修剪。
⚠️ 注意 :
传递
array-like
后的工作原理:如果传递
array-like
,Series
里的数值,和边界比较大小的过程,是逐个元素进行的:Series
里的第1个元素,和array-like
里的第1个元素比较;Series
里的第2个元素,和array-like
里的第2个元素比较;- …
- 直到所有元素比较完成。
传递
array-like
的注意事项:-
📌 在未来版本中,
Series.clip
不再自行推断数据类型,如果准备修剪的数据不是 浮点数float
,并且你在lower
或upper
参数中传递了array-like
:- 你会收到最多两条
FutureWarning
,但是在当前版本并不影响程序运行。 其一来自 不是浮点数类型Series
,另一个会来自你传递给lower
或upper
参数的 包含了pd.NA
的array-like
! 需要注意的是,np.NaN
和pd.NA
的区别。例2-1 - 如果你无法忍受这个提示,推荐方法是,把
Series
需要修剪的数据,使用astype
转为 浮点数float
。并使用np.NaN
作为缺失值,而不是pd.NA
。例2-2
- 你会收到最多两条
-
array-like
如果有缺失值, 此缺失值,对应的Series
里的数值,将不会被修剪。例2-3 -
array-like
的长度,必须和Series
的行列(依axis
参数指定)等长,否则报错ValueError
。 -
原理上
array-like
包含list
,但是如果涉及到计算,则必须使用能支持缺失值的结构,比如ndarray
或Series
等。建议是直接转为Series
,再用于修剪,因为即使你不转换,pandas也会自行转换为Series
。例2-4
传递
array-like
的意义:- 通过 传递
array-like
可以实现Series
每一个元素,都有自己的 专属边界 ,做到按位置精准修剪。 - 通过 传递
array-like
可以实现Series
某个位置的数值不被修剪(该数值在array-like
里,对应 NaN,即可以不被修剪)
upper 最大边界
-
upper : float or array-like, default None
upper
参数,用于指定数据的最大边界,沿轴数据中比upper
大的值,会被替换为upper
,默认upper=None
表示不限制最大边界:upper
参数可以和lower
参数一起使用。 例3- float: 指定一个浮点数(整数也行),作为最小边界
- array-like: 指定一个 array-like 作为最大边界。这可以做到按指定位置修剪。
⚠️ 注意 :
注意内容,与
lower
参数的注意内容一致。
axis 指定修剪方向(行或列)
-
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
axis
参数,对于Series
无效。
inplace 原地修改正
-
inplace : bool, default False 例4
inplace
: 用于控制是否原地修改(在原Series
直接修剪数据),默认inplace=False
。- False 不原地修改,会生成原
Series
的视图。 - True 原地修改(在原
Series
直接修剪数据),使修剪直接在原数据里生效。
- False 不原地修改,会生成原
相关方法:
➡️ 相关方法
DataFrame.clip
修剪
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
例1:小于最小边界的数据值,修剪为边界值
例1-1 构建演示数据
import pandas as pd
data = [9, -3, 0, -1, 5]
s = pd.Series(data)
s
0 9
1 -3
2 0
3 -1
4 5
dtype: int64
例1-2 指定最小边界为 -1 ,则小于 -1 的数据值,都会被替换为 -1
s = s.clip(-1) # 等效于s.clip(lower=-1)
s
0 9
1 -1
2 0
3 -1
4 5
dtype: int64
例2:传递 array-like
的各种注意事项
例2-1 如果准备修剪的数据不是 浮点数float
,并且你在lower
或upper
参数中传递了array-like
则会收到版本提示 FutureWarning
import numpy as np
import pandas as pd
s2 = pd.Series({"第1列": [-5, -4, 0, 4, 5]})
list_for_clip = [-2, np.Na, 0, 1, 2]
s2 = s2.clip(list_for_clip) # 等效于s2.clip(lower=list_for_clip)
s2
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[14], line 6
2 import pandas as pd
4 s2 = pd.Series({"第1列": [-5, -4, 0, 4, 5]})
----> 6 list_for_clip = [-2, np.Na, 0, 1, 2]
8 s2 = s2.clip(list_for_clip) # 等效于s2.clip(lower=list_for_clip)
9 s2
File D:\ProgramData\miniconda3\envs\python3.12\Lib\site-packages\numpy\__init__.py:347, in __getattr__(attr)
344 "Removed in NumPy 1.25.0"
345 raise RuntimeError("Tester was removed in NumPy 1.25.")
--> 347 raise AttributeError("module {!r} has no attribute "
348 "{!r}".format(__name__, attr))
AttributeError: module 'numpy' has no attribute 'Na'
例2-2 转换 Series
数据类型为 float
,并使用 np.NaN
作为缺失值,就不会有版本提示了。
import numpy as np
import pandas as pd
s3 = pd.Series([-5, -4, 0, 4, 5]).astype(float)
list_for_clip = [-2, np.NaN, 0, 1, 2]
s3 = s3.clip(list_for_clip) # 等效于s43.clip(lower=list_for_clip)
s3
0 -2.0
1 -4.0
2 0.0
3 4.0
4 5.0
dtype: float64
例2-3 如果 array-like
包含缺失值,那么其在 Series
中对应的元素,不会被修剪。例如,我不想 Series
的 -4 被修剪,可以把array-like
的对应位置指定为缺失值。
import numpy as np
import pandas as pd
s4 = pd.Series([-5, -4, 0, 4, 5]).astype(float)
list_for_clip = [-2, np.NaN, 0, 1, 2]
s4 = s4.clip(list_for_clip) # 等效于s4.clip(lower=list_for_clip)
s4
0 -2.0
1 -4.0
2 0.0
3 4.0
4 5.0
dtype: float64
例2-4 如果涉及到计算,则必须使用能支持缺失值的结构,比如 ndarray
或 Series
等。
import numpy as np
import pandas as pd
s5 = pd.Series([-5, -4, 0, 4, 5]).astype(float)
list_for_clip = pd.Series([-2, np.NaN, 0, 1, 2])
s5 = s5.clip(list_for_clip + 1) # 等效于s5.clip(lower=list_for_clip +1 )
s5
0 -1.0
1 -4.0
2 1.0
3 4.0
4 5.0
dtype: float64
例3: lower
参数可以和 upper
参数一起使用
import numpy as np
import pandas as pd
s7 = pd.Series([-5, -4, 0, 4, 5]).astype(float)
list_for_clip = pd.Series([-2, np.NaN, 0, 1, 2])
s7 = s7.clip(list_for_clip, list_for_clip + 1, axis=0) # 等效于s7.clip(lower=list_for_clip,upper=list_for_clip + 1, axis=0)
s7
0 -2.0
1 -4.0
2 0.0
3 2.0
4 3.0
dtype: float64
例4:在原数据里直接修剪
import numpy as np
import pandas as pd
s8 = pd.Series([-5, -4, 0, 4, 5]).astype(float)
list_for_clip1 = pd.Series([-2, np.NaN, 0, 1, 2])
s8.clip(list_for_clip1, inplace=True, axis=0) # 等效于s8.clip(lower=list_for_clip1, inplace=True, axis=0)
s8
0 -2.0
1 -4.0
2 0.0
3 4.0
4 5.0
dtype: float64