2017-07-09 13 views
0

私はデータセットの重み計算を繰り返しており、重み付けされたグループが希望の目標にどのくらい近いかをチェックしています(例えば、以前の5%と比較して?)。特定の値よりも小さいまたはより大きい値のデータフレームをチェックする

私は元のデータフレームと「ターゲット」データフレームの両方を同様の構造に変換し、それらを差し引いて各セルの違いを表示しました。私は結果のデータフレームをスキャンして、グループに重み付けされた分布とターゲット分布の間に0.0001より大きい絶対差がないかどうかを確認したいと思います(もしそうなら、反復を止め、完了したdfを返します)。私はループを介して各列を評価することでこれを行うことができましたが、複数の列を一度に評価する良い方法はありますか?

私はここでやったことを、おそらくもっと良い方法があると確信しているので、どんな提案も歓迎します。ここで

def checkconvergence(): 
    totaldist = pd.DataFrame() 
    for col in df[columns]: 
     totaldist[col] = df.groupby(col)['Weight'].sum()/df['Weight'].sum() 
    target = pd.DataFrame.from_dict(weightdict) 
    comparison = target.subtract(totaldist, fill_value=0) 
    check = 0 
    for col in comparison[columns]: 
     if (abs(comparison[col]) < 0.0001).all(): 
      check+=1 
    if check == 4: 
     return df 
    else: 
     iterate(df) 

私のデータフレームの例は... totaldistのDFです:

GenderAge race income region 
1 0.037  0.148 0.109 0.179 
2 0.050  0.109 0.149 0.211 
3 0.091  0.049 0.224 0.375 
4 0.080  0.018 0.160 0.235 
5 0.079  0.676 0.235 
6 0.074    0.044 
7 0.079    0.080 
8 0.043   
9 0.064   
10 0.081   
11 0.083   
12 0.079   
13 0.077   
14 0.084   

とターゲットDF:

GenderAge race income region 
1 0.040  0.173 0.108 0.179 
2 0.057  0.125 0.148 0.211 
3 0.078  0.043 0.225 0.375 
4 0.074  0.019 0.161 0.235 
5 0.077  0.640 0.236 
6 0.075    0.043 
7 0.083    0.079 
8 0.039   
9 0.056   
10 0.078   
11 0.077   
12 0.081   
13 0.082   
14 0.103  

などのようなDF私の比較:

GenderAge race income region 
1 0.003  0.025 -0.001 0.000 
2 0.007  0.016 0.000 0.000 
3 -0.013  -0.006 0.001 0.000 
4 -0.006  0.001 0.001 0.000 
5 -0.002  -0.036 0.002 0.000 
6 0.001    0.000 
7 0.004    -0.001 
8 -0.004   
9 -0.008   
10 -0.003   
11 -0.006   
12 0.002   
13 0.005   
14 0.019   

この例では、comこの例のparison dfは0.0001より大きいいくつかの値を持っていますが、私のスクリプトはもはやこれがなくなるまで反復を続けます。

+0

データフレームのスニペットと、出力がどのように表示されるかを記入してください。 –

+0

確かに、ちょうど追加されました。 – oddnumberedcat

+0

あなたが投稿したものがソースですか?またはあなたの機能を実行した結果? –

答えて

0

違いを取るために、あなたがこれを行うことができます:

In [995]: target = (df2 - df1).fillna(0) 

0.0001より大きい絶対差を持つ任意のセルがあるかどうかを確認するには、df.transformを適用してから使用することができますdf.any()

In [1004]: ((target.transform(abs) > 0.0001).any()).any() 
Out[1004]: True 

最初のany()は、列の比較を返します。 2番目のany()は、すべての列の結果を返します。

In [1008]: df2 = (target.transform(abs) > 0.0001).any() 

In [1009]: df2 
Out[1009]: 
GenderAge  True 
race   True 
income  True 
region  False 
dtype: bool 
関連する問題