基于调整其他列的权重创建新列

时间:2017-01-31 21:39:10

标签: python pandas

我有一个包含10列的数据帧(df)。索引有许多不同的日期,但是有多个相同的日期(并按日期排序)。此外,这个问题的重要列是df ['Weight']和df ['Test']。

以下是仅有1个索引值(1/21/2017)的2列数据的示例,实际上有多个权重等的多个日期。

          Weight    Test
1/21/2017   0.1     NaN
1/21/2017   0.04    0.04
1/21/2017   0.03    Nan
1/21/2017   0.02    Nan
1/21/2017   0.2     0.2
1/21/2017   0.001   Nan
1/21/2017   0.1     0.1
1/21/2017   0.21    0.21
1/21/2017   0.003   Nan
1/21/2017   0.01    0.01
1/21/2017   0.04    0.04
1/21/2017   0.005   Nan
1/21/2017   0.05    0.05
1/21/2017   0.1      Nan
1/21/2017   0.091   Nan

对于特定索引,df ['Weight']加起来为1,对于索引的每个唯一日期都是如此。

我创建了一个测试列,只有在满足条件时才显示重量。

现在我正在尝试创建一个列df ['adjust weight'],它将查看Test列,如果有一个Nan,它会将df ['Weight']中的权重乘以0.75并将其分配给df ['adjusted_weight'],然后df ['Test']在特定日期不是nan的其余条目df ['Test']权重应按比例向上调整并分配给df ['调整权重']所以任何日期的df ['调整后的权重']之和= 1。

我希望它具有灵活性,所以我也可以将权重乘以0.5和0.75并按比例分配其他等等。

非常感谢你的帮助和支持。

祝福。

1 个答案:

答案 0 :(得分:1)

def bool_scale(df, col, cond, scale):
    cond = df[cond].notnull().values
    v = df.values
    i = df.columns.get_loc(col)
    w = v[:, i]
    w_up = w[cond].sum()
    return df.assign(
        adjusted_weight=np.where(
            cond, w * scale, w / (1 - w_up) * (1 - scale * w_up)))

bool_scale(df, 'Weight', 'Test', .75)

           Weight  Test  adjusted_weight
1/21/2017   0.100   NaN         0.146429
1/21/2017   0.040  0.04         0.030000
1/21/2017   0.030   NaN         0.043929
1/21/2017   0.020   NaN         0.029286
1/21/2017   0.200  0.20         0.150000
1/21/2017   0.001   NaN         0.001464
1/21/2017   0.100  0.10         0.075000
1/21/2017   0.210  0.21         0.157500
1/21/2017   0.003   NaN         0.004393
1/21/2017   0.010  0.01         0.007500
1/21/2017   0.040  0.04         0.030000
1/21/2017   0.005   NaN         0.007321
1/21/2017   0.050  0.05         0.037500
1/21/2017   0.100   NaN         0.146429
1/21/2017   0.091   NaN         0.133250

您可以在groupby

中应用它
kws = dict(col='Weight', cond='Test', scale=.75)
df.groupby(level=0).apply(bool_scale, **kws) 

                     Weight  Test  adjusted_weight
1/21/2017 1/21/2017   0.100   NaN         0.146429
          1/21/2017   0.040  0.04         0.030000
          1/21/2017   0.030   NaN         0.043929
          1/21/2017   0.020   NaN         0.029286
          1/21/2017   0.200  0.20         0.150000
          1/21/2017   0.001   NaN         0.001464
          1/21/2017   0.100  0.10         0.075000
          1/21/2017   0.210  0.21         0.157500
          1/21/2017   0.003   NaN         0.004393
          1/21/2017   0.010  0.01         0.007500
          1/21/2017   0.040  0.04         0.030000
          1/21/2017   0.005   NaN         0.007321
          1/21/2017   0.050  0.05         0.037500
          1/21/2017   0.100   NaN         0.146429
          1/21/2017   0.091   NaN         0.133250