按条件

时间:2017-06-21 11:53:56

标签: python pandas dataframe

我是Python的新手,我试图根据同一数据框的另一列条件计算DataFrame的新列。

我有一个包含A,B,C,D,E列的DataFrame。

我需要计算新的列F:

F = A - B if E == 'Y'
F = A - (C + D) if E == 'N'

我尝试使用函数Apply,但它不起作用。

这是我的代码:

def my_funcion(column): 
    if column == 'N' :
        return df['B']
    if column== 'Y' :
        return (df['C'] + df['D'])
df['F'] = df['A'] - df.apply(myfunction(df['E'], axis=1) 

但它向我显示了这个错误:

  

ValueError :('系列的真值是不明确的。使用a.empty,       a.bool(),a.item(),a.any()或a.all()。',u'发生在索引0'

1 个答案:

答案 0 :(得分:1)

我认为您可以使用numpy.where

如果E仅包含YN值,则解决方法:

np.random.seed(145)
df = pd.DataFrame(np.random.randint(10,size=(5,4)), columns=list('ABCD'))
df['E'] = ['Y'] * 3 + ['N'] * 2 

df['F'] = np.where(df['E'] == 'Y', df['A'] - df['B'], df['A'] - (df['C'] + df['D']))
print (df)

   A  B  C  D  E   F
0  5  5  6  7  Y   0
1  2  5  8  5  Y  -3
2  1  2  0  8  Y  -1
3  4  5  8  9  N -13
4  1  6  7  6  N -12

解决方案,如果列E不仅NY

np.random.seed(145)
df = pd.DataFrame(np.random.randint(10,size=(5,4)), columns=list('ABCD'))
df['E'] = ['Y'] * 2 + ['N'] * 2  + ['X']

df['F'] = np.where(df['E'] == 'Y', df['A'] - df['B'], 
          np.where(df['E'] == 'N', df['A'] - (df['C'] + df['D']), 100))
print (df)

   A  B  C  D  E    F
0  5  5  6  7  Y    0
1  2  5  8  5  Y   -3
2  1  2  0  8  N   -7
3  4  5  8  9  N  -13
4  1  6  7  6  X  100

如果想要使用apply(更慢):

def my_funcion(column): 
    if column['E'] == 'Y' :
        return column['B']
    if column['E'] == 'N' :
        return (column['C'] + column['D'])

df['F'] = df['A'] - df.apply(my_funcion, axis=1) 
print (df)

   A  B  C  D  E   F
0  5  5  6  7  Y   0
1  2  5  8  5  Y  -3
2  1  2  0  8  N  -7
3  4  5  8  9  N -13
4  1  6  7  6  N -12