2017-12-16 1 views
1

나는 다음과 같은 유형의 dataframe df이 : 지금 내 원래의 끝으로이 값을 연결하고자하는크로스 탭 값을 데이터 프레임과 연결 하시겠습니까?

Result A B C 
ID 
1  1 0 0 
2  1 1 0 
3  0 0 1 

:

ID Result Other_val 
1 A  y 
2 B  x 
2 A  x 
3 C  abc 

pd.crosstab(df.ID, df.Result) 사용 후를,이 같은 크로스 탭을 얻을 dataframe (이미 존재하는 Result 열을 제거한 후) :

ID A B C Other_val 
1 1 0 0 y 
2 1 1 0 x 
3 0 0 1 abc 

그러나, 나는 곤란하다. 십자가 표가 색인되는 이상한 방법 때문에 위의 표를 구성하는 데 pd.concat()을 사용할 수 없습니다.

어떤 도움이 필요합니까?

+0

같은 concat을 사용할 수는'Other_val'도'X Y abc'이 될 수도 있고, 내가 잘못? 그 주문에 대해 어떻게 결정합니까? – Cleb

+1

@ 클리브, 네가 맞아! 그것은 typo였습니다 – mDe

+0

희망 도움말 링크 https://stackoverflow.com/questions/47152691/how-to-pivot-a-dataframe/47152692#47152692 – Wen

답변

3

ID와 Other_val을 그룹화해야하기 때문에 찾고있는 것이 pd.crosstab([df.ID, df.Other_val], df.Result)이라고 생각합니다.

In [5]: pd.crosstab([df.ID, df.Other_val], df.Result) 
Out[5]: 
Result  A B C 
ID Other_val   
1 y   1 0 0 
2 x   1 1 0 
3 abc  0 0 1 
+1

그건 내 것보다 훨씬 깔끔하고 아마 받아 들여진 답 (+ 1); 생각하지도 않았지만 데이터 프레임을 맹목적으로 병합했습니다 ...;) 원하는 경우 .reset_index()를 추가 할 수 있습니다. – Cleb

+0

Thanks @Cleb. 너무 안좋아 받아 들여지지 않았다. – laguittemh

+1

그래서 나는 적어도 당신의 대답을 upvoted 또한 당신을 받아 들일 것을 권장합니다 (내 대답 아래에 코멘트를 참조하십시오). – Cleb

1

당신은

df2 = pd.crosstab(df.ID, df.Result) 

다음 중 당신이 원하는 결과를 얻을 열 순서를 변경하려면

ID Other_val A B C 
0 1   y 1 0 0 
1 2   x 1 1 0 
3 3  abc 0 0 1 

을 제공

df_final = df.drop('Result', axis=1).drop_duplicates('ID').join(df2, on='ID') 

을 할 수

df_final = df_final[['ID', 'A', 'B', 'C', 'Other_val']] 

    ID A B C Other_val 
0 1 1 0 0   y 
1 2 1 1 0   x 
3 3 0 0 1  abc 

또한이

pd.concat([df.drop('Result', axis=1).drop_duplicates('ID').set_index('ID'), df2], axis=1) 

    Other_val A B C 
ID     
1   y 1 0 0 
2   x 1 1 0 
3  abc 0 0 1 
+0

그게 효과가! 감사! – mDe

+0

@mDe : 도움이 되니 기쁩니다. laguittemh의 답변을 보길 원할 것입니다. 이것은 훨씬 깨끗해 보입니다. (항상 내 대답을 받아들이지 않고 받아 들일 수는 있습니다.) 나는 이것에 대해서 생각조차하지 않았지만 단지 맹목적으로 데이터 프레임을 합쳤다. :) – Cleb