如何使用pandas.qcut从列

时间:2017-06-01 21:19:06

标签: python sorting pandas dataframe data-manipulation

我目前正在尝试将一些数据操作为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列中的实际值排序?

谢谢!

1 个答案:

答案 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