代码之家  ›  专栏  ›  技术社区  ›  Brown Bear

基于少数条件的费率

  •  0
  • Brown Bear  · 技术社区  · 5 年前

    我要根据几列中的条件添加速率 如果 A > 30 +1和 B > 50 +1和 C > 80 +1,D不重要, 例如,我有一个矩阵(数据帧):

        A   B   C   D
    0  21  32  84  43  # 0 + 0 + 1
    1  79  29  42  63  # 1 + 0 + 0
    2  31  38   6  52  # 1 + 0 + 0
    3  92  54  79  75  # 1 + 1 + 0
    4   9  14  87  85  # 0 + 0 + 1
    

    我尝试的是:

    In [1]: import numpy as np
    In [2]: import pandas as pd
    In [36]: df = pd.DataFrame(
    np.random.randint(0,100,size=(5, 4)),
    columns=list('ABCD')
    )
    In [36]: df
    Out[36]: 
        A   B   C   D
    0  21  32  84  43
    1  79  29  42  63
    2  31  38   6  52
    3  92  54  79  75
    4   9  14  87  8
    
    • 创建系列( df['A'] > 30 )
    • 连接到框架上
    • 和和行
    In [37]: df['R'] = pd.concat(
    [(df['A'] > 30), (df['B'] > 50), (df['C'] > 80)], axis=1
    ).sum(axis=1)
    In [38]: df
    Out[38]: 
        A   B   C   D  R
    0  21  32  84  43  1
    1  79  29  42  63  1
    2  31  38   6  52  1
    3  92  54  79  75  2
    4   9  14  87  85  1
    

    结果如我所料,但也许有更简单的方法?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Brown Bear    5 年前

    你可以这样做:

    df['R'] = (df.iloc[:,:3]>[30, 50, 80]).sum(axis=1)
    

    使用列名的相同解决方案

    df['R'] = (df[['A','B','C']]>[30, 50, 80]).sum(axis=1)
    
        2
  •  2
  •   Vishnudev Krishnadas    5 年前

    怎么样

    df["R"] = (
        (df["A"] > 30).astype(int) +
        (df["B"] > 50).astype(int) +
        (df["C"] > 80).astype(int)
    )
    
        3
  •  1
  •   abhilb    5 年前

    你也可以试试这个。不知道是否更好。

    >>> df
        A   B   C   D
    0   8  47  95  52
    1  90  84  39  80
    2  15  52  37  79
    3  99  24  76   5
    4  93   4  97   0
    

    >>> df.apply(lambda x: int(x[0] > 30) + int(x[1] > 50) + int(x[2] > 80) , axis=1)
    0    1
    1    2
    2    1
    3    1
    4    2
    dtype: int64
    

    >>> df.agg(lambda x: int(x[0] > 30) + int(x[1] > 50) + int(x[2] > 80) , axis=1)
    0    1
    1    2
    2    1
    3    1
    4    2
    dtype: int64