【问题标题】:Creating a new column based on adjusting weights from other columns根据调整其他列的权重创建新列
【发布时间】:2017-06-17 12:04:35
【问题描述】:

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

这是一个只有 1 个索引值(2017 年 1 月 21 日)的 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['adjusted weight'] 它将查看 Test 列,如果有 Nan 它会将 df['Weight'] 中的权重乘以 0.75 并将其分配给df['adjusted_weight'],然后是 df['Test'] 在特定日期不是 nan 的其余条目,df['Test'] 权重应按比例向上调整并分配给 df['adjusted weight'] 所以任何日期的 df['adjusted weight'] 的总和 =1。

我希望它灵活一些,因此我还可以将权重乘以 0.5 和 0.75,然后按比例计算其余部分等。

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

最好的祝愿。

【问题讨论】:

  • 我不懂你的数学。 df.Test.sum() * 2 == 1.30 那么您是否希望为 Test is NaN 所在的行添加否定条目?
  • 抱歉,我的错误。我实际上想要 Weight * 0.75 中的权重,然后向上调整测试权重。已解决问题。
  • 这将有助于查看所需的输出。

标签: python pandas


【解决方案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

【讨论】:

  • 欣赏评论,是的,我确实搞砸了数学。本质上,我想在 Test 有值时扩大权重。我已经改变了问题以给出正确的逻辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多