看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pd.cut()
是 Pandas 提供的一种分箱(binning)方法,用于将连续数据划分为固定的区间(或类别),并返回对应的区间标签。这种操作在数据预处理阶段非常常见,尤其是将连续变量转换为分类变量(如离散化年龄或收入数据)。
Categorical
)或自定义的标签。pd.cut(x, bins, right=True,
labels=None, retbins=False,
precision=3, include_lowest=False,
duplicates='raise')
x
:需要分箱的一维数据(如 Series
、ndarray
)。bins
:right
:是否为右闭区间,默认为 True
(区间形如 (a, b]
)。labels
:['Low', 'Medium', 'High']
)。False
,则返回区间编号而不是标签。retbins
:是否返回实际使用的分箱边界,默认 False
。precision
:区间端点的小数精度,默认为 3。include_lowest
:是否将第一个区间的左端点包含在内(仅在 right=True
时生效)。duplicates
:'drop'
忽略重复边界。将数据分为 3 个等宽区间:
import pandas as pd
data = [1, 7, 5, 4, 6, 2, 8, 3, 10]
# 等宽分箱
result = pd.cut(data, bins=3)
print(result)
输出:
[(0.991, 4.0], (4.0, 7.0], (4.0, 7.0], (0.991, 4.0], (4.0, 7.0], ..., (7.0, 10.0]]
Categories (3, interval[float64, right]): [(0.991, 4.0] < (4.0, 7.0] < (7.0, 10.0]]
解释:
(0.991, 4.0]
、(4.0, 7.0]
、(7.0, 10.0]
。Categorical
对象,每个数据点对应一个区间。# 自定义分箱边界
bins = [0, 3, 6, 9]
result = pd.cut(data, bins=bins)
print(result)
输出:
[(0, 3], (6, 9], (3, 6], (3, 6], (3, 6], (0, 3], (6, 9], (0, 3], nan]
Categories (3, interval[int64, right]): [(0, 3] < (3, 6] < (6, 9]]
解释:
[0, 3, 6, 9]
。10
超出边界,返回 NaN
。# 自定义标签
bins = [0, 3, 6, 9]
labels = ['Low', 'Medium', 'High']
result = pd.cut(data, bins=bins, labels=labels)
print(result)
输出:
['Low', 'High', 'Medium', 'Medium', 'Medium', 'Low', 'High', 'Low', NaN]
Categories (3, object): ['Low' < 'Medium' < 'High']
解释:
Low
、Medium
、High
。10
超出边界,仍返回 NaN
。# 获取分箱结果和边界
result, bin_edges = pd.cut(data, bins=3, retbins=True)
print("Result:", result)
print("Bin edges:", bin_edges)
输出:
Result: [(0.991, 4.0], (4.0, 7.0], (4.0, 7.0], (0.991, 4.0], ..., (7.0, 10.0]]
Bin edges: [ 0.991 4. 7. 10. ]
解释:
retbins=True
返回实际分箱边界 [0.991, 4, 7, 10]
。设置 right=False
,区间左闭右开:
result = pd.cut(data, bins=3, right=False)
print(result)
输出:
[[1.0, 4.0),
[7.0, 10.0),
[4.0, 7.0),
[4.0, 7.0),
...,
[7.0, 10.0)]
Categories (3, interval[float64, left]):
[[1.0, 4.0) < [4.0, 7.0) < [7.0, 10.0)]
解释:
[a, b)
,即左闭右开。ages = [15, 22, 35, 45, 52, 63, 78]
bins = [0, 18, 35, 60, 100]
labels = ['Child', 'Youth', 'Adult', 'Senior']
age_groups = pd.cut(ages, bins=bins, labels=labels)
print(age_groups)
输出:
['Child', 'Youth', 'Youth', 'Adult', 'Adult', 'Senior', 'Senior']
Categories (4, object): ['Child' < 'Youth' < 'Adult' < 'Senior']
NaN
。data = [1, 7, 5, 4, 6, 2, 8, 3, 10]
bins = [0, 5, 10]
result = pd.cut(data, bins=bins, include_lowest=True)
print(result)
输出:
[(0, 5], (5, 10], (0, 5], (0, 5], ..., NaN]
Categories (2, interval[int64, right]): [(0, 5] < (5, 10]]
pd.cut()
是用于分箱的强大工具,主要用于:
如果你需要更复杂的分箱(如等分位分箱),可以使用 pandas 的 pd.qcut()
方法。
更新时间:2024-12-07 08:59:14 标签:pandas python 分箱