2016-06-05 3 views
1

나는 Excel에서이 테이블을 가지고 :하나의 셀에서 여러 값으로 하나의 핫 인코딩을 수행하려면 어떻게해야합니까?

id class 
0 2 3 
1 1 3 
2 3 5 

지금, 내가 파이썬에서 '특별'한 - 뜨거운 인코딩을 수행합니다. 첫 번째 테이블의 각 ID에는 두 개의 숫자가 있습니다. 각 숫자는 클래스 (class1, class2 등)에 해당합니다. 두 번째 테이블은 각 id에 대해 행의 각 숫자가 해당 클래스 열에 나타나고 다른 열은 단지 0이되는 첫 번째 테이블을 기반으로 작성됩니다. 예를 들어, id 0의 숫자는 2와 3입니다. 2는 class2에 배치되고 3은 class3에 배치됩니다.

id class1 class2 class3 class4 class5 
0 0  2  3  0  0 
1 1  0  3  0  0 
2 0  0  3  0  5 

내 이전 솔루션에

foo = lambda x: pd.Series([i for i in x.split()]) 
result=onehot['hotel'].apply(foo) 
result.columns=['class1','class2'] 
pd.get_dummies(result, prefix='class', columns=['class1','class2']) 

결과 :

class_1 class_2 class_3 class_3 class_5 
    0 0.0  1.0 0.0  1.0 0.0 
    1 1.0  0.0 0.0  1.0 0.0 
    2 0.0  0.0 1.0  0.0 1.0 

(class_3가 나타납니다 클래스 1, 4, 5는 결과는 같아야합니다 0의 기본을 얻을 두번). 이 문제를 해결하려면 어떻게해야합니까? (이 단계가 끝나면 원하는 형식으로 변환 할 수 있습니다.)

+1

@FengLi 그냥 머리를. 당신이했던 것처럼'lambda' 함수를 저장하는 것은 그들의 목적을 무효로 만듭니다. 대신에'def'를 사용할 수 있습니다. – SvbZ3r0

답변

3

설명 된대로 문제가 해결 되었습니까?

#!/usr/bin/python 

input = [ 
    (0, (2,3)), 
    (1, (1,3)), 
    (2, (3,5)), 
] 

maximum = max(reduce(lambda x, y: x+list(y[1]), input, [])) 
# Or ... 
# maximum = 0 
# for i, classes in input: 
# maximum = max(maximum, *classes) 

# print header. 
print "\t".join(["id"] + ["class_%d" % i for i in range(1, 6)]) 

for i, classes in input: 
    print i, 
    for r in range(1, maximum+1): 
     print "\t", 
     if r in classes: 
      print float(r), 
     else: 
      print 0.0, 
    print 

출력 :

id  class_1 class_2 class_3 class_4 class_5 
0  0.0  2.0  3.0  0.0  0.0 
1  1.0  0.0  3.0  0.0  0.0 
2  0.0  0.0  3.0  0.0  5.0 
3

이 3 열로 일본어 dataframe 분할 간단 할 수

id class_a class_b 
0 2   3 
1 1   3 
2 3   5 

그리고 그 위에 통상 하나의 핫 인코딩을 수행한다. 그 다음에는 다음과 같은 열의 중복으로 끝날 수 있습니다.

id ... class_a_3 class_b_3 ... class_b_5 
0   0   1    0 
1   0   1    0 
2   1   0    0 

그러나 사실을 단순하게 합친 후에 합칠 수 있습니다.

마찬가지로, 같은 논리를 돌리 양식으로 DF 변환 수 : 그

id class 
0 2 
0 3   
1 1 
1 3   
2 3 
2 5 

그러던 어느-뜨겁고, 키 ID에 합계를 사용하여 집계.

4

당신은 당신의 변수 categorical로 만들 필요가 그림과 같이 당신은 one hot encoding를 사용할 수 있습니다

In [18]: df1 = pd.DataFrame({"class":pd.Series(['2','1','3']).astype('category',categories=['1','2','3','4','5'])}) 

In [19]: df2 = pd.DataFrame({"class":pd.Series(['3','3','5']).astype('category',categories=['1','2','3','4','5'])}) 

In [20]: df_1 = pd.get_dummies(df1) 

In [21]: df_2 = pd.get_dummies(df2) 

In [22]: df_1.add(df_2).apply(lambda x: x * [i for i in range(1,len(df_1.columns)+1)], axis = 1).astype(int).rename_axis('id') 
Out[22]: 
    class_1 class_2 class_3 class_4 class_5 
id            
0   0  2  3  0  0 
1   1  0  3  0  0 
2   0  0  3  0  5 
관련 문제