2017-12-20 9 views
0

나는 python이 pandas 데이터 프레임으로 작업하는 데 문제가 있습니다. 모델을 예측하는 기계를 예측하려고합니다. 열차 데이터 프레임에 서페이스 열이 있고 테스트 데이터 프레임에 열이 없습니다. 그래서, 기차의 표면을 기반으로 한 몇 가지 기능을 만들 것입니다. groupby와 두 개의 열로 매핑하는 방법 pandas 데이터 프레임

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

여기에 내가 suface의 평균이 "고양이"기능에 grouby의 값을 설정했습니다. 차가운

이제 테스트에도 추가해야합니다. 따라서이 방법을 사용하여 각 그룹 별 열차의 값을 테스트 행에 매핑합니다.

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

그래서 문제가 없습니다. 이제 groupby에서 두 개의 열을 사용합니다.

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

하지만 테스트 용 데이터 프레임으로 매핑하는 방법을 모르겠습니다. 제발 내가이 문제를 처리하도록 도와 주시오, 아니면 제가 할 수 있도록 다른 방법을 알려주세요. 내 기차 내 테스트

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

지금 내가 예를 들어 평균가 표면 GROUPBY는 CAT1과 CAT2에 표면을 의미 할 것입니다

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

입니다 예를 들어

감사

(cat1, cat2) = (1,3)은 (10 + 5)/2 = 7.5

이제 테스트에 들어가야합니다. 이 값을 (cat1, cat2) = (1,3) 행에 매핑하십시오.

나는 당신이 나를 갖고 있기를 바랍니다.

+0

당신은 예를 들어 데이터를 간단한 코드를 만들 수 있습니다. – furas

답변

0

당신은 (SQLLEFT JOIN) 데이터베이스에 테이블과 같은 두 dataframes 가입을 다시

  • merge(how='left',) 컬럼에 인덱스 Cat1, Cat2를 변환하는 수단
  • 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 
    
  • 관련 문제