我有一个输入参数通过参数字典传递,如下所示-
paramDict = { "Period":
{
"Description": "A Period",
"Value" : ['9']
},
"AdditionalPeriods":
{
"Description": "An AdditionalPeriod",
"Value" : ['1']
}
}
我有一个数据帧“df_assetct”,如下所示-
^{pr2}$现在基于传递给参数字典的值,我想在python pandas中实现下面的“if else”条件-
^{3}$在sql中,上面的案例逻辑如下-
Case AdditionalPeriods = 0, Then NewColumn = 0
Case AdditionalPeriods = 1, Then NewColumn = FLN013
Case AdditionalPeriods = 2, Then NewColumn = FLN013 + FLN014
现在,我想使用函数在dataframe中创建一个新列-
df_AssetCst['NewColumn'] = df_AssetCst.apply(func, axis=1)
但是,这给了我下面的错误-
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 0')
在这之后,我想实现下面的“For”逻辑-
if Period.value = '9'
then NewColumn2 = FLN01+FLN02+FLN03+FLN04+FLN05+FLN06+FLN07+FLN08+FLN09
你能帮我指点迷津吗?最好的方法是一样。谢谢在
我的解决方案
#1. Function logic :
def func(row):
if paramDict['AdditionalPeriods']['Value'][0] == '0':
var = 0
elif paramDict['AdditionalPeriods']['Value'][0] == '1':
var = int(row['FLN13'])
elif paramDict['AdditionalPeriods']['Value'][0] == '2':
var = int(row['FLN13']) + int(row['FLN14'])
else:
var = -1
return(var)
#2. For logic
In_Period = paramDict['Period']['Value'][0]
colList = ['FLN{:0>2}'.format(X) for X in range(1, In_Period + 1)]
df_AssetCst['NewColumn1'] = df_AssetCst[colList].astype(int).sum(axis=1)
使用您在更新后的答案中编写的
func
函数(即您的解决方案),您应该能够使用带有参数axis=1
的DataFrame.apply
方法。(我还没有测试过,但如果有错误消息,您可以尝试应用它并报告错误消息)然而,在这个函数中,你指的是全局范围内的
param_dict
,虽然它起作用,但如果你不小心,可能会导致意想不到的后果,而IMO可能会导致以后更头痛。在这是
func
函数的另一个版本。这一个以类型的行作为参数pd系列,和一个param_dict
(您在问题中提供的字典)那么这应该是有效的:
^{pr2}$这个答案的关键在于
apply
方法接受任意位置关键字参数并将它们传递给函数。在相关问题 更多 >
编程相关推荐