基于多准则和多列的PANDAS新列

时间:2019-08-19 17:28:10

标签: python python-3.x pandas

我想使用几个条件和列为一个大表创建一个新列,并且不确定采用哪种最佳方法。

    df = pd.DataFrame({'a': ['A', "B", "B", "C", "D"],
'b':['y','n','y','n', np.nan], 'c':[10,20,10,40,30], 'd':[.3,.1,.4,.2, .1]})
    df.head()

    def fun(df=df):
        df=df.copy()
        if df.a=='A' & df.b =='n': 
            df['new_Col'] = df.c+df.d
        if df.a=='A' & df.b =='y': 
            df['new_Col'] = df.d *2
        else:
            df['new_Col'] = 0
        return df
    fun()

OR


    def fun(df=df):
            df=df.copy()
            if df.a=='A' & df.b =='n': 
                return = df.c+df.d
            if df.a=='A' & df.b =='y': 
                return  df.d *2
            else:
                return 0
    df['new_Col"] df.apply(fun)

或使用np.where

    df['new_Col'] = np.where(df.a=='A' & df.b =='n', df.c+df.d,0 )
    df['new_Col'] = np.where(df.a=='A' & df.b =='y', df.d *2,0 )

2 个答案:

答案 0 :(得分:4)

您似乎需要np.select

a, n, y = df.a.eq('A'), df.b.eq('n'), df.b.eq('y')

df['result'] = np.select([a & n, a & y], [df.c + df.d, df.d*2], default=0)

答案 1 :(得分:2)

这是一种算术方式(在案例a = 'A'b = 'n' 的示例中我又增加了一行):

样本

Out[1369]:
   a    b   c    d
0  A  y    10  0.3
1  B  n    20  0.1
2  B  y    10  0.4
3  C  n    40  0.2
4  D  NaN  30  0.1
5  A  n    50  0.9

nc = df.a.eq('A') & df.b.eq('y')
mc = df.a.eq('A') & df.b.eq('n')
nr = df.d * 2
mr = df.c + df.d

df['new_col'] = nc*nr + mc*mr

Out[1371]:
   a    b   c    d  new_col
0  A  y    10  0.3  0.6
1  B  n    20  0.1  0.0
2  B  y    10  0.4  0.0
3  C  n    40  0.2  0.0
4  D  NaN  30  0.1  0.0
5  A  n    50  0.9  50.9