我有一个包含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个桶。
此致
答案 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