pandas:将数据bin转换为特定大小的特定bin数

时间:2018-01-14 11:47:09

标签: pandas binning

我想将数据框中的单个列中的值绑定到特定大小和数字的bin中。

以下是df:

的示例
df= pd.DataFrame(np.random.randint(0,10000,size=(10000, 4)), columns=list('ABCD'))

假设我想按列D进行分区,我将首先对数据进行排序:

df.sort('D')

我现在希望bin以便第一个if bin大小为50且bin number为100,前50个值将进入bin 1,下一个进入bin 2,依此类推。二十个箱后的任何剩余值都应该进入最后一个箱。无论如何这样做?

编辑:

以下是输入示例:

x = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))

这是预期的输出:

    A   B   C   D   bin
0   6   8   6   5   3
1   5   4   9   1   1
2   5   1   7   4   3
3   6   3   3   3   2
4   2   5   9   3   2
5   2   5   1   3   2
6   0   1   1   0   1
7   3   9   5   8   3
8   2   4   0   1   1
9   6   4   5   6   3

另外,是否也可以在同一个bin中装入任何相等的值?例如,假设我的bin 1包含值0,1,1,然后bin 2包含1,1,2。有没有办法将bin 2中的这两个值放入bin 1?这将产生非常不均匀的箱尺寸,但这不是问题。

1 个答案:

答案 0 :(得分:1)

您似乎需要分差np.arange,然后分配到新列:

idx = df['D'].sort_values().index
df['b'] = pd.Series(np.arange(len(df)) // 3 + 1, index = idx)
print (df)
   A  B  C  D  bin  b
0  6  8  6  5    3  3
1  5  4  9  1    1  1
2  5  1  7  4    3  3
3  6  3  3  3    2  2
4  2  5  9  3    2  2
5  2  5  1  3    2  2
6  0  1  1  0    1  1
7  3  9  5  8    3  4
8  2  4  0  1    1  1
9  6  4  5  6    3  3

详情:

print (np.arange(len(df)) // 3 + 1)
[1 1 1 2 2 2 3 3 3 4]

编辑:

我创建了有关上一个值here的问题的另一个问题:

N = 3
idx = df['D'].sort_values().index

#one possible solution, thanks divakar
def replace_irregular_groupings(a, N):
    n = len(a)
    m = N*(n//N)
    if m!=n:
        a[m:] = a[m-1]
    return a

idx = df['D'].sort_values().index
arr = replace_irregular_groupings(np.arange(len(df)) // N + 1, N)
df['b'] = pd.Series(arr, index = idx)
print (df)

   A  B  C  D  bin  b
0  6  8  6  5    3  3
1  5  4  9  1    1  1
2  5  1  7  4    3  3
3  6  3  3  3    2  2
4  2  5  9  3    2  2
5  2  5  1  3    2  2
6  0  1  1  0    1  1
7  3  9  5  8    3  3
8  2  4  0  1    1  1
9  6  4  5  6    3  3