首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在pandas中同时输出bins和labels列

在pandas中同时输出bins和labels列
EN

Stack Overflow用户
提问于 2020-05-13 23:29:30
回答 1查看 588关注 0票数 1

我有一个dataframe列,我想在其上执行绑定,例如:

代码语言:javascript
运行
复制
df.head
X
4.6
2.5
3.1
1.7

我想要一列用于bin范围,一列用于标签,如下所示:

代码语言:javascript
运行
复制
df.head
X bin label
4.6 (4,5] 5
2.5 (2,3] 3
3.1 (3,4] 4
1.7 (1,2] 2

显然,按如下方式设置label参数只会生成一个用于bin标签的列,而不再是范围的列。

代码语言:javascript
运行
复制
df['bin'] = df.X.apply(pd.cut, labels=np.arange(5))

对于这两列,有没有更好的解决方案,而不是运行pd.cut 2次?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-14 05:17:03

如果您允许pd.cut动态设置bin边缘,则可以使用retbins标志。从pd.cut documentation

代码语言:javascript
运行
复制
retbins: bool, default False
    Whether to return the bins or not. Useful when bins is provided as a scalar.

这将返回第二个结果:

代码语言:javascript
运行
复制
bins: numpy.ndarray or IntervalIndex.
    The computed or specified bins. Only returned when
    retbins=True. For scalar or sequence bins, this is
    an ndarray with the computed bins. If set
    duplicates=drop, bins will drop non-unique bin. For
    an IntervalIndex bins, this is equal to bins.

您可以使用此选项将箱形边指定给框架:

代码语言:javascript
运行
复制
assignments, edges = pd.cut(df.X, bins=5, labels=False, retbins=True)
df['label'] = assignments
df['bin_floor'] = edges[assignments]
df['bin_ceil'] = edges[assignments + 1]

您的注释表明您希望在groupby操作中使用它。在这种情况下,您可以将上述内容封装在一个函数中:

代码语言:javascript
运行
复制
def assign_dynamic_bin_ids_and_labels(
    df,
    value_col,
    nbins,
    label_col='label',
    bin_floor_col='bin_floor',
    bin_ceil_col='bin_ceil',
):
    assignments, edges = pd.cut(
        df[value_col], bins=5, labels=False, retbins=True
    )

    df[label_col] = assignments
    df[bin_floor_col] = edges[assignments]
    df[bin_ceil_col] = edges[assignments + 1]

    return df

df.groupby('id').apply(assign_dynamic_bin_ids_and_labels, 'X', 5)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61778610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档