函数&Pandas中的for逻辑

2024-10-01 02:37:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入参数通过参数字典传递,如下所示-

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)

Tags: df参数if字典valuevarperiodint
1条回答
网友
1楼 · 发布于 2024-10-01 02:37:48

使用您在更新后的答案中编写的func函数(即您的解决方案),您应该能够使用带有参数axis=1DataFrame.apply方法。(我还没有测试过,但如果有错误消息,您可以尝试应用它并报告错误消息)

然而,在这个函数中,你指的是全局范围内的param_dict,虽然它起作用,但如果你不小心,可能会导致意想不到的后果,而IMO可能会导致以后更头痛。在

这是func函数的另一个版本。这一个以类型的行作为参数pd系列,和一个param_dict(您在问题中提供的字典)

def func(row, param_dict):
   """
   Gets the key from the param_dict, and tries to return the element
   from _conversion_map.
   if the key doesn't exist in the conversion map, then returns -1
   """
   key = param_dict['AdditionalPeriods']['Value'][0] 
   _conversion_map = {
        '0': 0,
        '1': int(row.FLN13),
        '2': int(row.FLN13) + int(row.FLN14)
        }
    try:
        return _conversion_map[key]
    except KeyError:
        return -1

那么这应该是有效的:

^{pr2}$

这个答案的关键在于apply方法接受任意位置关键字参数并将它们传递给函数。在

相关问题 更多 >