将pandas dataframe列分成n个桶

时间:2017-02-22 05:39:16

标签: python pandas

我有一个包含7列的pandas数据帧。对于其中一个列,我想仅根据值将其内容划分为n-buckets。因此,如果我的列的值为<a href="#" class="read">sign up<i class="fa fa-angle-right"></i></a></div>,我会添加一个新列,其中的存储桶为1, 3, 5 ... (2*n+1)

此外,我并不想要归一化,即使我在列中有100个3,我希望它们在同一个桶中。所以,如果我有1,2,3...n,我的输出将为1, 3, 3, 3, 5, ... (2*n+1)

有人可以指导我怎么做。

- 编辑 -

我的实际数据有超过一百万行。所以,如果我使用排名,我会获得从1到100万的排名。我想要的是将等级划分为桶。例如,如果我有300万行,最终排名从1到150万。如果我想把它分成3个桶,1个第一个桶,第一个50万级,第二个桶,下一个50万个,依此类推。同样,如果我想把它分成7个桶。

此致

2 个答案:

答案 0 :(得分:2)

Pandas的功能cut()用于此类分组:

data=pd.Series([1,3,3,3,5,7,13])
n_buckets = (data.max() - data.min()) // 2 + 1
buckets = pd.cut(data, n_buckets, labels=False) + 1
#0    1
#1    2
#2    2
#3    2
#4    3
#5    4
#6    7

答案 1 :(得分:0)

您需要rank

df = pd.DataFrame({'col':[1,5,3,9,5,3,7,10]})
print (df)
   col
0    1
1    5
2    3
3    9
4    5
5    3
6    7
7   10

df['col1'] = df.col.rank(method='dense').astype(int)
print (df)
   col  col1
0    1     1
1    5     3
2    3     2
3    9     5
4    5     3
5    3     2
6    7     4
7   10     6

编辑:我认为你需要分区//

n = 3
df['col1'] = np.arange(len(df.index)) // n
print (df)
   col  col1
0    1     0
1    7     0
2    3     0
3    3     1
4    5     1
5    7     1
6   13     2

如果单调增加指数如0,1,2...n

n = 3
df['col1'] = df.index // n
print (df)
   col  col1
0    1     0
1    7     0
2    3     0
3    3     1
4    5     1
5    7     1
6   13     2