我是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'
答案 0 :(得分:1)
我认为您可以使用numpy.where
:
如果E
仅包含Y
和N
值,则解决方法:
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
不仅N
和Y
:
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