首页 文章

Python 2.7 - 计算每行的分位数

提问于
浏览
1

我有一个像这样的熊猫系列:

0       1787
1       4789
2       1350
3       1476
4          0
5        747
6        307
7        147
8        221
9        -88
10      9374
11       264
12      1109
13       502
14       360
15       194
16      4073
17      2317
18      -221
20         0
21        16
22       106
29       105
30      4189
31       171
32        42

我想创建4个热编码变量,指示每行的哪个值在哪个四分位数上,将系列划分为4个四分位数 . 它会是这样的:

0       1787   Q1   Q2  Q3  Q4
1       4789   0    0   0   0
2       1350   0    0   0   1
3       1476   1    0   0   0
4          0   0    1   0   0 
5        747   0    0   1   0
6        307   1    0   1   0
7        147   0    1   0   1

我知道这些数字并不完全匹配,这只是为了给出所需输出的可视化示例 .

我试过这个:

series.quantile[0.25, 0.5, 0.75, 1]

但这只会贬低这四个值:

0.25         67
0.50      442.5
0.75    1477.75
1.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 回答

  • 1

    以下代码以pandas.qcutpandas.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
    
  • 1

    我想你可以尝试一下 .

    • 使用系列创建数据框
    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
    

相关问题