我有以下DataFrames:
example = pd.DataFrame({"dirr":[1,0,-1,-1,1,-1,0],
"value": [125,130,80,8,150,251,18],
"result":[np.NaN for _ in range(7)]})
我想用cummin()和cummax()对它执行以下操作:
example["result"].apply(lambda x : x= example["value"].cummax() if example["dirr"]==1
else x= example["value"].cummin() if example["dirr"]==-1
else x= NaN if if example["dirr"]==0
)
返回:error: invalid syntax
。
有人能帮助我纠正那个吗?
这将是预期的输出:
example = pd.DataFrame({"dirr":[1,0,-1,-1,1,-1,0],
"value": [125,130,80,8,150,251,18],
"result":[125, NaN, 80, 8, 150, 8, NaN]})
编辑:
根据@ su79eu7k的答案,以下函数可以:
def calc(x):
if x['dirr'] == 1:
return np.diag(example["value"].cummax())
elif x['dirr'] == -1:
return np.diag(example["value"].cummin())
else:
return np.nan
我应该能够把它推到一个lambda但是仍然被语法错误阻止了......我仍然没有看到?
example["result"]=example.apply(lambda x : np.diag(x["value"].cummax()) if x["dirr"]==1
else np.diag(x["value"].cummin()) if x["dirr"]==-1
else NaN if x["dirr"]==0
)
最后一点点推动形式,你们将非常感激。
答案 0 :(得分:2)
我认为使用单独的行代替应用是最有意义的。如果你确实使用了apply函数,你应该创建一个单独的函数并传递它,而不是制作一个三行lambda。
example.loc[example['dirr'] == 1, 'result'] = \
example.loc[example['dirr'] == 1, 'value'].cummax()
example.loc[example['dirr'] == -1, 'result'] = \
example.loc[example['dirr'] == -1, 'value'].cummin()
>>> example
dirr result value
0 1 125.0 125
1 0 NaN 130
2 -1 80.0 80
3 -1 8.0 8
4 1 150.0 150
5 -1 8.0 251
6 0 NaN 18
以下替代apply
方法。
current_max = 0
current_min = 9999
def func(df):
global current_max
global current_min
if df['dirr'] == 1:
current_max = max(current_max, df['value'])
return current_max
elif df['dirr'] == -1:
current_min = min(current_min, df['value'])
return current_min
else:
return np.nan
example['result'] = example.apply(func, axis=1)
答案 1 :(得分:2)
我认为@ 3novak的解决方案简单快捷。但是如果你真的想使用apply
函数,
def calc(x):
if x['dirr'] == 1:
return example["value"].cummax()
elif x['dirr'] == -1:
return example["value"].cummin()
else:
return np.nan
example['result'] = np.diag(example.apply(calc, axis=1))
print example
dirr result value
0 1 125.0 125
1 0 NaN 130
2 -1 80.0 80
3 -1 8.0 8
4 1 150.0 150
5 -1 8.0 251
6 0 NaN 18
答案 2 :(得分:0)
所有numpy
v = example.value.values
d = example.dirr.values
mx = np.maximum.accumulate(v)
mn = np.minimum.accumulate(v)
example['result'] = np.where(d == 1, mx, np.where(d == -1, mn, np.nan))
example
dirr result value
0 1 125.0 125
1 0 NaN 130
2 -1 80.0 80
3 -1 8.0 8
4 1 150.0 150
5 -1 8.0 251
6 0 NaN 18
时间