如何使用函数将数据集值转换为百分位数?

时间:2018-03-24 23:32:24

标签: python python-3.x pandas dataset data-conversion

我正在尝试将数据集值转换为百分位数,并且我为此问题创建了一个函数,但它似乎不起作用,但是,当我运行函数中使用的相同代码时,它可以正常工作。请有人能帮我弄清楚为什么我不能在函数中运行代码?非常感谢你的帮助。

我有以下数据集:

    A   B   C   D
0  31  78  10  35
1  73  78   6  69
2  59  24  26   0
3  87  55  13  41
4  13   9  32  97
5  32  93  71  52
6  35  72  63  10
7  30  40  29  30
8  85  85  31   2

我希望使用以下函数获得每个值的百分位数:

import pandas as pd
data = pd.read_csv('datafile.csv')

def percentile_convert(x):
    x['A_Prcnt'] = pd.qcut(x.A, 100, labels=False) / 100
    x['B_Prcnt'] = pd.qcut(x.B, 100, labels=False) / 100
    x['C_Prcnt'] = pd.qcut(x.C, 100, labels=False) / 100
    x['D_Prcnt'] = pd.qcut(x.D, 100, labels=False) / 100
    x = x[['A_Prcnt', 'B_Prcnt', 'C_Prcnt', 'D_Prcnt']]
    return x

data = data.apply(percentile_convert, axis=1)

运行后,我收到以下错误:

ValueError: ("Bin edges must be unique: array([31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,\n       31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,\n       31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,\n       31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,\n       31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,\n       31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31]).\nYou can drop duplicate edges by setting the 'duplicates' kwarg", 'occurred at index 0')

但是如果我在函数之外运行相同的代码,就像这样:

data['A_Prcnt'] = pd.qcut(data.A, 100, labels=False, duplicates='drop') / 100
data['B_Prcnt'] = pd.qcut(data.B, 100, labels=False, duplicates='drop') / 100
data['C_Prcnt'] = pd.qcut(data.C, 100, labels=False, duplicates='drop') / 100
data['D_Prcnt'] = pd.qcut(data.D, 100, labels=False, duplicates='drop') / 100

data = data[['A_Prcnt', 'B_Prcnt', 'C_Prcnt', 'D_Prcnt']]
print(data)

我得到了想要的结果,即:

   A_Prcnt  B_Prcnt  C_Prcnt  D_Prcnt
0     0.24     0.62     0.12     0.49
1     0.74     0.62     0.00     0.87
2     0.62     0.12     0.37     0.00
3     0.99     0.37     0.24     0.62
4     0.00     0.00     0.74     0.99
5     0.37     0.87     0.99     0.74
6     0.49     0.49     0.87     0.24
7     0.12     0.24     0.49     0.37
8     0.87     0.75     0.62     0.12

1 个答案:

答案 0 :(得分:0)

嗯,你忘记了

drop_duplicates = True

在调用参数中。

两种情况下的代码都不同