2017-12-20 11 views
0

私はpandasデータフレームで作業するpythonに問題があります。私はモデルを予測するモデルを学習するマシンを作ろうとしています。列車のデータフレームにサーフェスの列があり、テストデータフレームにサーフェスの列がありません。だから、列車内のサーフェスに基づいていくつかのフィーチャを作成したいと思います。groupbyと2つの列でマップする方法pandasデータフレーム

train['error_cat1'] = abs(train.groupby(train['cat1'])['surface'].transform('mean') - train.surface.mean()) 

ここで私はgroubyの値をsufaceの平均で「cat」というフィーチャーで設定しました。クール

今私もテストに追加する必要があります。したがって、このメソッドを使用して、各グループの列車の値をテスト行にマップします。

mp = {k: g['error_cat1'].tolist()[0] for k,g in train.groupby('cat1')} 
test['error_cat1'] = test['cat1'].map(mp) 

これまでのところ問題ありません。今、私はgroupbyで2つの列を使用します。

train['error_cat1_cat2'] = abs(train.groupby(train[['cat1','cat2']])['surface'].transform('mean') - train.surface.mean()) 

しかし、私はテストデータフレームのためのマップ方法はわかりません。この問題を扱うのを手伝ったり、私ができるように他の方法を教えてください。例えば

おかげ

私の列車が

+------+------+-------+ 
| Cat1 | Cat2 | surface | 
+------+------+-------+ 
| 1 | 3 | 10 | 
+------+------+-------+ 
| 2 | 2 | 12 | 
+------+------+-------+ 
| 3 | 1 | 12 | 
+------+------+-------+ 
| 1 | 3 | 5  | 
+------+------+-------+ 
| 2 | 2 | 10 | 
+------+------+-------+ 
| 3 | 2 | 13 | 
+------+------+-------+ 

私のテストは今、私は意味が表面例えばCAT1とCAT2の表面を意味GROUPBYを行うだろう

+------+------+ 
| Cat1 | Cat2 | 
+------+------+ 
| 1 | 2 | 
+------+------+ 
| 2 | 1 | 
+------+------+ 
| 3 | 1 | 
+------+------+ 
| 1 | 3 | 
+------+------+ 
| 2 | 3 | 
+------+------+ 
| 3 | 1 | 
+------+------+ 

です(cat1、cat2)=(1,3)は(10 + 5)/ 2 = 7.5

今、私はテストに行く必要がありますこの値を(cat1、cat2)=(1,3)行にマップします。

私はあなたが私を持っていることを願っています。

+0

誰もがそれを実行し、ソリューションを作成することができますので、あなたは、例えば、データを単純なコードを作成することができます。 – furas

答えて

0

あなたは(SQLLEFT JOIN)データベース内のテーブルのような2つのデータフレームを結合するために再び

  • merge(how='left',)列にインデックスCat1Cat2を変換するための手段
  • reset_index()を計算する

    • groupby().means()を使用することができます。

    headers = ['Cat1', 'Cat2', 'surface'] 
    
    train_data = [ 
        [1, 3, 10], 
        [2, 2, 12], 
        [3, 1, 12], 
        [1, 3, 5], 
        [2, 2, 10], 
        [3, 2, 13], 
    ] 
    
    test_data = [ 
        [1, 2], 
        [2, 1], 
        [3, 1], 
        [1, 3], 
        [2, 3], 
        [3, 1], 
    ] 
    import pandas as pd 
    
    train = pd.DataFrame(train_data, columns=headers) 
    test = pd.DataFrame(test_data, columns=headers[:-1]) 
    
    print('--- train ---') 
    print(train) 
    
    print('--- test ---') 
    print(test) 
    
    print('--- means ---') 
    means = train.groupby(['Cat1', 'Cat2']).mean() 
    print(means) 
    
    print('--- means (dataframe) ---') 
    means = means.reset_index(level=['Cat1', 'Cat2']) 
    print(means) 
    
    print('--- result ----') 
    result = pd.merge(df2, means, on=['Cat1', 'Cat2'], how='left') 
    print(result) 
    
    print('--- result (fillna)---') 
    result = result.fillna(0) 
    print(result) 
    

    結果:

    --- train --- 
        Cat1 Cat2 surface 
    0  1  3  10 
    1  2  2  12 
    2  3  1  12 
    3  1  3  5 
    4  2  2  10 
    5  3  2  13 
    --- test --- 
        Cat1 Cat2 
    0  1  2 
    1  2  1 
    2  3  1 
    3  1  3 
    4  2  3 
    5  3  1 
    --- means --- 
          surface 
    Cat1 Cat2   
    1 3   7.5 
    2 2  11.0 
    3 1  12.0 
        2  13.0 
    --- means (dataframe) --- 
        Cat1 Cat2 surface 
    0  1  3  7.5 
    1  2  2  11.0 
    2  3  1  12.0 
    3  3  2  13.0 
    --- result ---- 
        Cat1 Cat2 surface 
    0  1  2  NaN 
    1  2  1  NaN 
    2  3  1  12.0 
    3  1  3  7.5 
    4  2  3  NaN 
    5  3  1  12.0 
    --- result (fillna)--- 
        Cat1 Cat2 surface 
    0  1  2  0.0 
    1  2  1  0.0 
    2  3  1  12.0 
    3  1  3  7.5 
    4  2  3  0.0 
    5  3  1  12.0 
    
  • 関連する問題