我想将数据框中的单个列中的值绑定到特定大小和数字的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?这将产生非常不均匀的箱尺寸,但这不是问题。
答案 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