为了账号安全,请及时绑定邮箱和手机立即绑定

Python 2.7 - 计算每行的分位数

Python 2.7 - 计算每行的分位数

MYYA 2021-09-11 17:32:38
我有一个像这样的熊猫系列:0       17871       47892       13503       14764          05        7476        3077        1478        2219        -8810      937411       26412      110913       50214       36015       19416      407317      231718      -22120         021        1622       10629       10530      418931       17132        42我想创建 4 个 one 热编码变量,指示每行哪个值位于哪个四分位数,将系列分成 4 个四分位数。它会是这样的:0       1787   Q1   Q2  Q3  Q41       4789   0    0   0   02       1350   0    0   0   13       1476   1    0   0   04          0   0    1   0   0 5        747   0    0   1   06        307   1    0   1   07        147   0    1   0   1我知道数字并不完全匹配,这只是为了给出所需输出的直观示例。我试过这个:series.quantile[0.25, 0.5, 0.75, 1]但这只能喊出这四个值:0.25         670.50      442.50.75    1477.751.00      71188我也试过这个:series.apply(lambda x : series.quantile(x, 'lower'))但是,这给出了以下错误:ValueError: percentiles should all be in the interval [0, 1]. Try 17.87 instead.实现我的目标的最佳方法是什么?非常感谢您提前
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

以下代码以pandas.qcut和pandas.get_dummies为特色应该做


quantiles = pd.qcut(series,

                    [0, 0.25, 0.5, 0.75, 1],

                    labels=['Q1', 'Q2', 'Q3', 'Q4'])

dummies = pd.get_dummies(quantiles)

pd.concat([df, dummies], axis=1)

导致


    Series  Q1  Q2  Q3  Q4

0     1787   0   0   0   1

1     4789   0   0   0   1

2     1350   0   0   1   0

3     1476   0   0   0   1

4        0   1   0   0   0

5      747   0   0   1   0

6      307   0   0   1   0

7      147   0   1   0   0

8      221   0   1   0   0

9      -88   1   0   0   0

10    9374   0   0   0   1

11     264   0   1   0   0

12    1109   0   0   1   0

13     502   0   0   1   0

14     360   0   0   1   0

15     194   0   1   0   0

16    4073   0   0   0   1

17    2317   0   0   0   1

18    -221   1   0   0   0

20       0   1   0   0   0

21      16   1   0   0   0

22     106   0   1   0   0

29     105   1   0   0   0

30    4189   0   0   0   1

31     171   0   1   0   0

32      42   1   0   0   0


查看完整回答
反对 回复 2021-09-11
?
忽然笑

TA贡献1806条经验 获得超5个赞

我想你可以试试这个。


使用系列创建数据框



df = pd.DataFrame({'Series': series})



使用分位数数据(包括 0)创建第二个 df



quantiles = df['Series'].quantile([0, 0.25, 0.5, 0.75, 1]).to_frame('quantiles').reset_index(drop = True)



使用此 for 循环创建 Q 列。



for quant, Q in enumerate(['Q1', 'Q2', 'Q3', 'Q4']):

    quant = quant + 1

    df.loc[:,Q] = np.where((df.Series > quantiles.quantiles[quant-1]) & (df.Series <= quantiles.quantiles[quant]), 1, 0)



这应该给你这个:


Series  Q1  Q2  Q3  Q4

0   1787    0   0   0   1

1   4789    0   0   0   1

2   1350    0   0   1   0

3   1476    0   0   0   1

4   0   1   0   0   0

5   747 0   0   1   0

6   307 0   0   1   0

7   147 0   1   0   0

8   221 0   1   0   0

9   -88 1   0   0   0

10  9374    0   0   0   1

11  264 0   1   0   0

12  1109    0   0   1   0

13  502 0   0   1   0

14  360 0   0   1   0

15  194 0   1   0   0

16  4073    0   0   0   1

17  2317    0   0   0   1

18  -221    0   0   0   0

19  0   1   0   0   0

20  16  1   0   0   0

21  106 0   1   0   0

22  105 1   0   0   0

23  4189    0   0   0   1

24  171 0   1   0   0

25  42  1   0   0   0


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信