我有一个包含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并按比例分配其他等等。
非常感谢你的帮助和支持。
祝福。
答案 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