首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫-不同标签的不同回收箱

熊猫-不同标签的不同回收箱
EN

Stack Overflow用户
提问于 2022-08-03 13:08:53
回答 1查看 207关注 0票数 1

我有一个数据框架,有两个不同的标签,A和B,以及一个相关的数值。我希望添加一个列,该列提供数字值所属的自定义bin的标签,这可以通过pd.cut()实现,如下所示:

代码语言:javascript
运行
复制
df = pd.DataFrame({"label": ['A','A','A','A','A','A','B','B','B','B'],
                   "num":   [ 1 , 2 , 4 , 5 , 10, 11, 1 , 3 , 4 , 5 ]})

df['Bin'] = pd.cut(df["num"],
                   [0, 4.5, 7.5, np.inf],
                   labels=['0-4', '5-8', '>8'],
                   include_lowest=True)

给予:

代码语言:javascript
运行
复制
  label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-4
7     B    3  0-4
8     B    4  0-4
9     B    5  5-8

但是,这对于A很好,但是B的值是这样的,大多数值都落在底部的垃圾桶中,所以我想增加A和B的不同回收箱的分辨率,以产生以下结果:

代码语言:javascript
运行
复制
  label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-2
7     B    3  2-4
8     B    4  2-4
9     B    5   >4

这似乎是可能的,比如使用条件,比如df.where(),或者使用带有transform()apply()groupby,或者使用if来理解列表,但是我一整天都在阅读堆栈溢出和乱七八糟的东西,却什么也没做。

我想我可以基于label分离成单个数据帧,对这个子数据处理执行一个自定义的cut,然后将结果连接在一起,但是这感觉并不是很通俗,或者可以使用通用代码。

PS --这是一个很小的例子,我的实际数据帧有更多的label值,我希望将它保持为一个具有不同回收箱的单一数据帧,以便在我的代码中进一步处理,因此不会基于label分离成两个单独的数据帧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-03 13:11:42

是的,groupby().apply()是一个很好的选择,例如,您可以:

代码语言:javascript
运行
复制
df['Bin'] = df.groupby('label')['num'].apply(pd.cut,bins=3)

输出:

代码语言:javascript
运行
复制
  label  num             Bin
0     A    1   (0.99, 4.333]
1     A    2   (0.99, 4.333]
2     A    4   (0.99, 4.333]
3     A    5  (4.333, 7.667]
4     A   10   (7.667, 11.0]
5     A   11   (7.667, 11.0]
6     B    1  (0.996, 2.333]
7     B    3  (2.333, 3.667]
8     B    4    (3.667, 5.0]
9     B    5    (3.667, 5.0]

或者,如果您有针对每个label的特定的回收箱/标签映射,您可以这样做:

代码语言:javascript
运行
复制
bins = {'A': [0,4.5,7.5, np.inf], 'B': [0,2.5,4.5,np.inf]}
labels={'A':['0-4', '5-8', '>8'], 'B': ['0-2','2-4','>4']}
def my_cut(data, bins, labels):
    label = data['label'].iloc[0]
    return pd.cut(data['num'], bins=bins[label], labels=labels[label])

df['Bin'] = df.groupby('label', group_keys=False).apply(my_cut, bins=bins, labels=labels)

输出:

代码语言:javascript
运行
复制
  label  num  Bin
0     A    1  0-4
1     A    2  0-4
2     A    4  0-4
3     A    5  5-8
4     A   10   >8
5     A   11   >8
6     B    1  0-2
7     B    3  2-4
8     B    4  2-4
9     B    5   >4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73222312

复制
相关文章

相似问题

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