代码之家  ›  专栏  ›  技术社区  ›  Ahamed Moosa

将数据放入范围

  •  2
  • Ahamed Moosa  · 技术社区  · 6 年前

    我有一个像下面这样的数据框架,我想创建4列来计算精度分布

    Company Error_Rate
    A       9
    B      10
    c      20
    GK     17
    GK     18
    GK     30
    GK     35
    GK     25
    GK     32
    GK     40
    GK     50
    MB     60
    MB     70
    MB     70
    

    我想要一张这样的桌子

    Company Error_Rate  Above 90%   80% - 90%   65% - 80%   Below 65%
    A              9    1           0           0           0
    B             10    1           0           0           0
    c             20    0           1           0           0
    GK            17    0           1           0           0
    GK            18    0           1           0           0
    GK            30    0           0           1           0
    GK            35    0           0           1           0
    GK            40    0           0           0           1
    

    我试过了

    df['Above 90%'] = np.where(df['Error_Rate']<=10,1,0)
    df['80% - 90%'] = np.where(df['Error_Rate'] <= 20,(np.where(df['Error_Rate'] > 10, 1, 0)),0)
    df['65% - 80%'] = np.where(df['Error_Rate'] <= 35,(np.where(df['Error_Rate'] > 20, 1, 0)),0)
    df['Below 65%'] = np.where(df['Error_Rate']>35,1,0)
    

    它没有给我期望的结果。我哪里出错了吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   cs95 abhishek58g    6 年前

    如果你必须写4 np.where 计算列的条件,你做的不对。我认为考虑一种不同的方法是明智的。

    一个简洁的选择包括 pd.cut + pd.get_dummies .

    bins = [0, 65, 80, 90, 100]
    labels = ['Below 65%', '65% - 80%', '80% - 90%', 'Above 90%']
    
    pd.concat([
        df, pd.get_dummies(pd.cut(100 - df.Error_Rate, bins=bins, labels=labels, right=True))
       ], axis=1
    )
    
       Company  Error_Rate  Below 65%  65% - 80%  80% - 90%  Above 90%
    0        A           9          0          0          0          1
    1        B          10          0          0          0          1
    2        c          20          0          0          1          0
    3       GK          17          0          0          1          0
    4       GK          18          0          0          1          0
    5       GK          30          0          1          0          0
    6       GK          35          0          1          0          0
    7       GK          25          0          1          0          0
    8       GK          32          0          1          0          0
    9       GK          40          1          0          0          0
    10      GK          50          1          0          0          0
    11      MB          60          1          0          0          0
    12      MB          70          1          0          0          0
    13      MB          70          1          0          0          0
    
        2
  •  1
  •   jezrael    6 年前

    用途:

    df['Above 90%'] = np.where(df['Error_Rate']<=10,1,0)
    df['80% - 90%'] = np.where((df['Error_Rate'] <= 20) & (df['Error_Rate'] > 10),1,0)
    df['65% - 80%'] = np.where((df['Error_Rate'] <= 35) & (df['Error_Rate'] > 20),1,0)
    df['Below 65%'] = np.where(df['Error_Rate']>35,1,0)
    
    print (df)
       Company  Error_Rate  Above 90%  80% - 90%  65% - 80%  Below 65%
    0        A           9          1          0          0          0
    1        B          10          1          0          0          0
    2        c          20          0          1          0          0
    3       GK          17          0          1          0          0
    4       GK          18          0          1          0          0
    5       GK          30          0          0          1          0
    6       GK          35          0          0          1          0
    7       GK          25          0          0          1          0
    8       GK          32          0          0          1          0
    9       GK          40          0          0          0          1
    10      GK          50          0          0          0          1
    11      MB          60          0          0          0          1
    12      MB          70          0          0          0          1
    13      MB          70          0          0          0          1