2017-04-11 2 views
1

두 개의 열 (id1id2)이있는 데이터 프레임이 있습니다.데이터 프레임을 재 형성하는 파이썬 팬더

df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [12,13,12,11,13,13]}) 
print(df) 

id1  id2 
A  123 
B  13 
C  12 
B  11 
A  13 
C  132 

그리고 난 다음 얻기 위해 (아마, GROUPBY 또는 피벗을 사용하고 계십니까?)을 바꿀하려는 각 id1 두 행이 정확히 있다는 것을

id1  id2-1 id2-2 
A  123  13 
B  13  11 
C  12  132 

참고하지만, 많은 수의 id2의 다른 값 (그래서 나는 하나의 핫 벡터 인코딩을하지 않을 것입니다). 출력이주고, 사전 편찬 식 순서에 따라 정렬 될 수 있다면

선호도가있다 :

id2-1id2-2의 값이 정렬 각 행
id1  id2-1 id2-2 
A  13  123 
B  11  13 
C  12  132 

즉 (행이 id1 == 'B' 대응 참조).

답변

3

계획 우리는 각각의 연속 시간 동안 우리가 'id1'의 값을 참조하는 것이 인덱스를 생성 할

  • . 이를 위해 groupby('id1')을 입력 한 다음 cumcount()을 사용하여 새로운 색인을 제공하십시오.
  • 우리는 다음 pd.MultiIndexset_index
  • 는 우리가 마침내 unstack
  • 로 설정되어 pd.MultiIndex 함께하는 인덱스를 설정, 우리는 몇 가지 까다로운 매핑

d = df.set_index(['id1', df.groupby('id1').cumcount() + 1]).unstack() 
d.columns = d.columns.to_series().map('{0[0]}-{0[1]}'.format) 

print(d) 

    id2-1 id2-2 
id1    
A  12  13 
B  13  11 
C  12  13 
+2

이것은 나중에 참조 할 수 있도록 메모로 들어간 종류의 답변입니다. – Vaishali

+1

@ A-Za-z too kind – piRSquared

+1

@ A-Za-z Amen. 나는 동의한다. –

1

이 그것을 수행해야합니다

import pandas as pd 
df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [123,13,12,11,13,132]}) 
df['id2'] = df['id2'].astype(str) 
df = df.groupby(['id1']).agg(lambda x: '-'.join(x)) 
df['id2-1'] = df['id2'].apply(lambda x: x.split('-')[0]).astype(int) 
df['id2-2'] = df['id2'].apply(lambda x: x.split('-')[1]).astype(int) 
df = df.reset_index()[['id1', 'id2-1', 'id2-2']] 
+0

에 열 이름을 변경 나는 샘플을 지나치게 단순화했기 때문에 약간의 문제가있다. 내'id1'은 숫자로 채워져 있으므로'groupby.sum()'은 계획대로 작동하지 않습니다. 샘플을 업데이트했습니다. – ysearka

+0

수정보기 슬프게도 2 자리 숫자로만 작동 – zipa

+0

예, 다시 편집했습니다. 'id2'숫자의 숫자가 모두 같은 것은 아닙니다 (단,'simple 'apply '). – ysearka

관련 문제