我有一个包含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