如何使用pandas根据条件重新排列数列中的列数

2024-09-30 14:17:57 发布

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

我有一个表的系数和其他值从一个GLM。我想编码一个函数,使系数重新调整为我选择的单位值。所以,如果一个免赔额的参考值/单位值是0,我想它是500,这个函数会通过,把这个变量的每个系数除以500的系数。你知道吗

下面是一些示例代码:

df3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'married_age','married_age','married_age', 'class_cc', 'class_cc', 'class_cc', 'class_cc', 'class_v_age'
                  ,'class_v_age','class_v_age', 'class_v_age'],
      'level': [None,0,100,200,250,500,750,1000, 60, 61, 62, 100, 1200, 1500, 100
                ,10, 20, 15, 10],
      'value': [None, 460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44
                ,31805316.37, 123.4, 4546.50, 439854.23, 2134.4, 2304.5, 2032.30, 159.80, 22],
       'coefficient': [-2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356 , 0.00174356
                       ,-1.004648e-02, -1.004648e-02,-1.071730e-02,-1.812330e-04,-1.812330e-04,8.727980e-04,1.402564e-03
                      ,-1.681685e-01, -8.442040e-02, -1.812330e-04, -1.465950e-01]}

results = pd.DataFrame(df3)
results['factor'] = results['level']*results['coefficient']
results

def rebase(df, variable1, unity_value):
    """
    rebase the factors according to where the modeler wants the unity to be

    """

    df['factor_rebased'] = "" 
    base_factor = df[(df['variable'] == variable1) & (df['level'] == unity_value)]['coefficient']
    if df['variable'].any() == variable1:
        df['factor_rebased'] = df['coefficient']/base_factor


    return df['factor_rebased']

rebase(results, 'CLded_model', 500)

结果是一个空序列。我想要的结果是一个名为factor_rebased的新列,在该列中,我可以在循环中为每个唯一变量重新运行此函数,而不必保存重定基值。你知道吗

理想第一轮的结果是这样的,运行rebase(results,'CLded\u model',500)将CLded_model变量的每个因子除以2.391(500级的因子):

df3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'married_age','married_age','married_age', 'class_cc', 'class_cc', 'class_cc', 'class_cc', 'class_v_age'
                  ,'class_v_age','class_v_age', 'class_v_age'],
      'level': [None,0,100,200,250,500,750,1000, 60, 61, 62, 100, 1200, 1500, 100
                ,10, 20, 15, 10],
      'value': [None, 460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44
                ,31805316.37, 123.4, 4546.50, 439854.23, 2134.4, 2304.5, 2032.30, 159.80, 22],
       'coefficient': [-2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356 , 0.00174356
                       ,-1.004648e-02, -1.004648e-02,-1.071730e-02,-1.812330e-04,-1.812330e-04,8.727980e-04,1.402564e-03
                      ,-1.681685e-01, -8.442040e-02, -1.812330e-04, -1.465950e-01],
      'factor': [ None, 1.        , 1.1904793 , 1.41724097, 1.54633869,
       2.39116334, 3.69754838, 5.71766211, 0.54728324, 0.5418125 ,
       0.51454483, 0.98203994, 0.80454402, 3.70319885, 1.15056877,
       0.1860602 , 0.18481351, 0.9972852 , 0.23085857],
      'factor_rebased':[None, .418, .592, .647, 1, 1.660, 2.391, None,None,None,None,None,None,None,None,None,None,None,None]}




results = pd.DataFrame(df3)
results

第二轮运行(循环)是这样的,已婚年龄因素都除以0.5418-已婚年龄60级的因素:

df3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'married_age','married_age','married_age', 'class_cc', 'class_cc', 'class_cc', 'class_cc', 'class_v_age'
                  ,'class_v_age','class_v_age', 'class_v_age'],
      'level': [None,0,100,200,250,500,750,1000, 60, 61, 62, 100, 1200, 1500, 100
                ,10, 20, 15, 10],
      'value': [None, 460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44
                ,31805316.37, 123.4, 4546.50, 439854.23, 2134.4, 2304.5, 2032.30, 159.80, 22],
       'coefficient': [-2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356 , 0.00174356
                       ,-1.004648e-02, -1.004648e-02,-1.071730e-02,-1.812330e-04,-1.812330e-04,8.727980e-04,1.402564e-03
                      ,-1.681685e-01, -8.442040e-02, -1.812330e-04, -1.465950e-01],
      'factor': [ None, 1.        , 1.1904793 , 1.41724097, 1.54633869,
       2.39116334, 3.69754838, 5.71766211, 0.54728324, 0.5418125 ,
       0.51454483, 0.98203994, 0.80454402, 3.70319885, 1.15056877,
       0.1860602 , 0.18481351, 0.9972852 , 0.23085857],
      'factor_rebased':[None, .418, .592, .647, 1, 1.660, 2.391, 1.01,1,.99,None,None,None,None,None,None,None,None,None]}




results = pd.DataFrame(df3)
#results['factor'] = np.exp(results['level']*results['coefficient'])
results

所以我不知道为什么我会得到一个空的序列。感谢社区提供的任何帮助。你知道吗


Tags: nonedfagemodellevelvariableresultsclass
1条回答
网友
1楼 · 发布于 2024-09-30 14:17:57

有几件事你可以/应该改变。详见备注:

def rebase(df, variable1, unity_value):
    """
    rebase the factors according to where the modeler wants the unity to be

    """

    # you would erase all your previous run by this line
    # df['factor_rebased'] = "" 
    # instead do, where 0 makes more sense than "", but it's up to you
    if ('factor_rebased' not in df.columns): df['factor_rebased'] = 0

    # I'm not sure what do you want by this
    # what if there is no df['level'] == unity_value
    base_factor = df[(df['variable'] == variable1) & (df['level'] == unity_value)]['coefficient'].values

    # if df['variable'].any() == variable1:
    # ...
    # I believe what you mean is  
    filters = df['variable'].eq(variable1)
    if filters.any():
        df.loc[filters, 'factor_rebased'] = df.loc[filters, 'coefficient']/base_factor

    # why return? You already update df['factor_rebased']
    # return df['factor_rebased']

相关问题 更多 >