2017-01-31 2 views
1

私は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 [ '重']は、特定のインデックスに対して最大1を追加します。これは、インデックスの一意の日付ごとに適用されます。

条件が満たされている場合にのみ重みを表示するテスト列を作成しました。

今、私はTestカラムを見ているカラムdf ['adjusted weight']を作成しようとしています。もしNanがあれば、df ['Weight']にあるウェイトに0.75を掛け、 df ['Test']の重みはdf ['Tested']の重みをdf ['adjusted_weight']に設定し、調整された重み ']を計算します。したがって、任意の日付のdf [' adjusted weight ']の合計は1です。私も休みなど、ヘルプとサポートのため

おかげで、すべてそんなにのために行わ0.5と0.75と按分によりウェイトを掛けることができるように

は、私はそれが柔軟になりたいです。

最高の願い。

+0

でそれを適用することができます。 'df.Test.sum()* 2 == 1.30'だから、' Test is NaN'の行に対して負のエントリを持たせたいのですか? – MaxU

+0

謝罪、私の間違い。私は実際に重量* 0.75で重量を求めてから、テスト重量を上向きに調整します。質問を修正しました。 – MysterioProgrammer91

+0

希望の出力を見るのに役立ちます。 – Parfait

答えて

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 
+0

コメントを評価する、はい私​​は数学を台無しにしました。基本的には、テストに値があるときはいつでもウェイトをスケールアップしたかったのです。正しいロジックを与えるために質問を変更しました。ありがとう。 – MysterioProgrammer91

+0

@ MysterioProgrammer91あなたの編集内容が反映されるように修正されました – piRSquared

関連する問題