我目前正在尝试将一些数据操作为10个分位数。
我加载的数据框有一列A,B和C
我当前的代码可以将它们分成10个相同大小的组,但我想要实现的是基于行中的实际数字。所以我想把它分成10列十分之一的C值中的等值。这肯定意味着十分位数每个桶的条目数量不同。这可以通过pd.qcut吗?有人能指出我正确的方向吗?
目前的代码如下:
user_df['decile'] = pd.qcut(user_df['C'].rank(method='first').values, 10, duplicates='drop').codes + 1
user_df.groupby('decile')
如何按C列中的实际值排序?
谢谢!
答案 0 :(得分:0)
考虑数据框df
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(100, 3), columns=list('ABC'))
然后我们可以使用
列建立基于'C'
列的严格单调序列
c = df.C.values
c -= c.min()
c = c.cumsum()
然后建立我们的桶的边界
cuts = np.arange(11) * c[-1] / 10
最后分配一个新列
df['decile'] = cuts.searchsorted(c)
# equivalent but slower
# df['decile'] = pd.cut(c, cuts, labels=range(1, 11))
它并不完美,因为我按照它们出现的顺序构建了桶
df.groupby('decile').C.sum()
decile
1 4.060410
2 3.728364
3 4.417033
4 4.119732
5 4.070618
6 4.450897
7 3.981932
8 4.504357
9 3.733634
10 4.738445
Name: C, dtype: float64
但是,超过1000
行
df.groupby('decile').C.sum()
decile
1 48.481552
2 49.718306
3 49.108860
4 49.443570
5 49.205949
6 49.017016
7 48.973904
8 49.427361
9 49.152014
10 49.436423
Name: C, dtype: float64