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



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

这里是一个只有1个索引值的2列数据示例(2017年1月21日),实际上有多个日期具有多个权重等。

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["adjusted weight"],它将查看Test列,如果有Nan,它将把df["weight"中的权重乘以0.75,并将其分配给df["djusted_weight"],然后,对于特定日期,df["测试"]不是nan的其余条目,df["测试"]权重应按比例向上调整,并分配给df["调整后的权重"],因此任何日期的df["已调整权重"]之和=1。

我希望它是灵活的,这样我也可以将权重乘以0.5和0.75,并按比例计算其余部分等。

非常感谢大家的帮助和支持。

致以最良好的祝愿。

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

最新更新