2017-10-22 4 views
0

私は以下のようなデータフレームを持っています。最終的にVar,Type、およびLevelは、組み合わせると一意のエントリを表します。適切なグループ分け(例えば、「Any-All Exposed」は「Any All Unexposed」で除算されますが、「Any Existing Exposed」は「Any Any Exposed」で除算されます。未露光既存の」データフレーム全体を特定の行でどのように分割できますか?

Var Type  Level   Metric1 Metric2 Metric3 
Any All  Unexposed  34842 30783 -12 
Any All  Exposed   54167 54247 0.15 
Any All  LowExposure  20236 20311 0.37 
Any All  MediumExposure 15254 15388 0.87 
Any All  HighExposure  18677 18548 0.7 
Any New  Unexposed  0  23785 0 
Any New  Exposed   0  43030 0 
Any New  LowExposure  0  16356 0 
Any New  MediumExposure 0  12213 0 
Any New  HighExposure  0  14461 0 
Any Existing Unexposed  34843 6998 -80 
Any Existing Exposed   54167 11217 -80 
Any Existing LowExposure  20236 3955 -81 
Any Existing MediumExposure 15254 3175 -79 
Any Existing HighExposure 18677 4087 -78 

これを実行する最も簡単な方法は、私が思うに、mulitindexを作成することになるが、私はそれができるというエラーを受け取る、通常は(無駄に様々な方法を試してみました「がt)は非一意インデックスに分割する。

期待される結果をすべての行にvarと種類の値に応じて未露光列によって分割されるもののような、あろう。

Var Type  Level   Metric1 Metric2 Metric3 MP1 MP2  MP3 
Any All  Unexposed  34842 30783 -12  1.00 1.00 1.00 
Any All  Exposed   54167 54247 0.15  1.55 1.76 -0.01 
Any All  LowExposure  20236 20311 0.37  0.58 0.66 -0.03 
Any All  MediumExposure 15254 15388 0.87  0.44 0.50 -0.07 
Any All  HighExposure  18677 18548 0.7  0.54 0.60 -0.06 
Any New  Unexposed  0  23785 0  0.00 1.00 0.00 
Any New  Exposed   0  43030 0  0.00 1.81 0.00 
Any New  LowExposure  0  16356 0  0.00 0.69 0.00 
Any New  MediumExposure 0  12213 0  0.00 0.51 0.00 
Any New  HighExposure  0  14461 0  0.00 0.61 0.00 
Any Existing Unexposed  34843 6998 -80  1.00 1.00 1.00 
Any Existing Exposed   54167 11217 -80  1.55 1.60 1.00 
Any Existing LowExposure  20236 3955 -81  0.58 0.57 1.01 
Any Existing MediumExposure 15254 3175 -79  0.44 0.45 0.99 
Any Existing HighExposure 18677 4087 -78  0.54 0.58 0.98 
+0

([私はこれが役立つかもしれないと思う] https://stackoverflow.com/questions/34820910/divide-all-pandas-data-by-a-specific-row) –

+0

私はそれがうまくいくとは思わない。私のデータフレームは、私が投稿したものよりもはるかに大きいので、1行を取得するだけでは機能しません。各列にはいくつかの潜在的な値があります。したがって、さまざまな組み合わせがあります。値は、ロードするデータセットによって異なる場合があります。私は柔軟にすべての異なる順列を考慮に入れることができるものを探しています。 – kodachrome

+0

私はこれに従っていません、あなたはこのおもちゃの例のために期待される結果を示すことができますか? – matusko

答えて

0

私は正しくそれを得たかわからない。このようなsthはトリックを行うだろうか? すべての固有の組み合わせを解析し、除算を実行できます。

0
var_col= df['Var'].unique() 
type_col= df['Type'].unique() 

for i in var_col: 
    for j in type_col: 
     result= df[df['Var']==i][df['Type']==j][df['Level']=='Exposed']/df[df['Var']==i][df['Type']==j][df['Level']=='Unexposed'] 
     ... 

、特定Levelによって各Var/Typeグループ内のすべての行を分割groupbydivideを使用します。たとえば、あなたの出力例のように、Unexposedによって

を分割する:

def divide_by(g, denom_lvl): 
    cols = ["Metric1", "Metric2", "Metric3"] 
    num = g[cols] 
    denom = g.loc[g.Level==denom_lvl, cols].iloc[0] 
    return num.divide(denom).fillna(0).round(2) 

df.groupby(['Var','Type']).apply(divide_by, denom_lvl='Unexposed') 

出力:

Metric1 Metric2 Metric3 
0  1.00  1.00  1.00 
1  1.55  1.76 -0.01 
2  0.58  0.66 -0.03 
3  0.44  0.50 -0.07 
4  0.54  0.60 -0.06 
5  0.00  1.00  0.00 
6  0.00  1.81  0.00 
7  0.00  0.69  0.00 
8  0.00  0.51  0.00 
9  0.00  0.61  0.00 
10  1.00  1.00  1.00 
11  1.55  1.60  1.00 
12  0.58  0.57  1.01 
13  0.44  0.45  0.99 
14  0.54  0.58  0.98 
関連する問題