基于少数条件的费率

时间:2019-12-28 10:18:56

标签: python pandas

我想根据几栏中的条件添加汇率 如果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

结果和我预期的一样,但是也许还有更简单的方法?

3 个答案:

答案 0 :(得分:4)

您可以这样做:

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

使用列名的相同解决方案

df['R'] = (df[['A','B','C']]>[30, 50, 80]).sum(axis=1)

答案 1 :(得分:2)

怎么样

df["R"] = (
    (df["A"] > 30).astype(int) +
    (df["B"] > 50).astype(int) +
    (df["C"] > 80).astype(int)
)

答案 2 :(得分:1)

您也可以尝试一下。不确定是否更好。

>>> 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