【问题标题】:Conditionally binning有条件地分箱
【发布时间】:2016-12-23 14:58:17
【问题描述】:

是否可以在数据框中创建一个新列,其中“X”的 bin 基于另一列的值。下面的例子。

AR1、PO1 和 RU1 的 bin 彼此不同。

到目前为止,我只能获取“X”中所有值的 bin。

import pandas as pd
import numpy as np
import string
import random

N = 100
J = [2012,2013,2014]
K = ['A','B','C','D','E','F','G','H']
L = ['h','d','a']
S = ['AR1','PO1','RU1']

np.random.seed(0)

df = pd.DataFrame(
    {'X': np.random.uniform(1,10,N),
     'Y': np.random.uniform(1,10,N),
     'J':np.random.choice(J, N),
     'R':np.random.choice(L, N),
     'S':np.random.choice(S,N)
    })

df['bins_X'] = pd.qcut(df['X'], 10)

print(df.head())

我想要的输出:

编辑;

在我的真实数据上,我得到一个 ValueError:edges are not unique。我可以用即排名来解决这个问题吗?我如何将其添加到建议的解决方案中?

【问题讨论】:

    标签: python pandas binning


    【解决方案1】:

    groupbyS 上简单使用pd.qcut

    df['bins_X'] = df.groupby('S').X.apply(pd.qcut, q=10, labels=np.arange(10))
    
    df.groupby(['bins_X', 'S']).size().unstack()
    
    S       AR1  PO1  RU1
    bins_X               
    0         3    4    4
    1         3    3    4
    2         3    3    4
    3         2    3    4
    4         3    4    4
    5         3    3    3
    6         2    3    4
    7         3    3    4
    8         3    3    4
    9         3    4    4
    

    如果您希望它们拥有自己独特的边缘,请保留 labels 参数

    df['bins_X'] = df.groupby('S').X.apply(pd.qcut, q=10)
    

    【讨论】:

    • 离开标签参数时出现错误:ValueError: incompatible categories in categorical concat。知道为什么吗?
    • 您可能使用的是旧版本的 pandas。我发现 this link 描述了 pandas 0.15 中的错误。您可以升级(如果我是正确的,那就是问题所在)
    • 感谢您找到链接。我去看看。
    • 你也可以试试df['bins_X'] = df.groupby('S').X.apply(lambda x: pd.qcut(x, 10).to_string())
    猜你喜欢
    • 2023-01-20
    • 2020-10-31
    • 2011-05-18
    • 1970-01-01
    • 2014-03-05
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多