通过python按百分位数对数据集中的每个要素进行分类

时间:2016-09-28 05:20:07

标签: python

我正试图找到一种方法来根据数据集的百分位数对数据集中的每一列进行分类。例如,请考虑列:

 ticket
 24160
 113781
 113781
 113781
 113781
 19952
 13502
 112050
 11769

上面列的第20个百分位数是1350.基本上我想将该列转换为分类变量,其中0-20th百分位数的所有值= 1,所有值来自20-40百分位数= 2,所有值来自40-60%百分位数= 3,依此类推。因此票证功能将是1,2,3,4或5的分类变量。我想将此转换应用于除最后一列之外的数据集中的每一列。到目前为止,我编码:

   import numpy as np
   import pandas as pd

   dataset = pd.read_csv('somedataset.csv')
   def func(x):
      if min(x)<=x< np.percentile(x, 20):
       return 1
      elif  np.percentile(x, 20)<=x< np.percentile(x, 40):
        return 2
     elif  np.percentile(x, 40)<=x< np.percentile(x, 60):
        return 3
     elif  np.percentile(x, 60)<=x< np.percentile(x, 80):
        return 4
     elif  x = max(x):
        return 5
    dataset[:]= dataset[:].apply(func)

除了我数据集中的最后一列之外,我不知道如何将此函数应用于每一列。我非常感谢任何反馈!

1 个答案:

答案 0 :(得分:1)

np.floor(df[df.columns[:-1]].rank() / len(df) / .2).astype(int) + 1

上面的代码返回您想要的内容,其列名与原始数据相同。

  1. df[df.columns[:-1]]除了您请求的最后一列之外的所有子集
  2. .rank()给出项目的整数等级,从最小到最大
  3. / len(df) / .2为您提供百分位桶
  4. np.floor(...).astype(int) + 1为您提供从1
  5. 开始的整数