2016-11-01 4 views
1

ID, Phone1, Phone2 및 Phone3의 4 개 열이있는 데이터 프레임이 있습니다. ID, 전화 번호, PhoneSource라는 세 개의 열이있는 새로운 데이터 프레임을 만들고 싶습니다. 내가 this question에서와 같은 APPEND 할 경우 는 :팬더 - 열 이름을 유지하면서 열을 하나에 병합

df['Column 1'].append(df['Column 2']).reset_index(drop=True) 

을 내가 원하는 무엇의 절반을 얻을 : 모든 전화 번호가 같은 열에 있습니다. 하지만 어떻게 소스를 유지합니까?

+1

당신이 원시 데이터와 코드 당신이 DFS를 작성하고 원하는 출력 외모 방지하기 위해 무엇을 좋아하기를 게시 할 수 있습니다 모호성 – EdChum

+0

나는 @EdChum을 당신의 관점으로 본다. 그러나 나는 이전에 링크 된 질문이 어떤 맥락을주고 있다고 생각했다. 게으른 내 부분에, 나는 인정한다! –

+0

여기 양식은 문제와 원하는 결과를 재현하는 코드를 게시하는 것입니다. 관련 질문에 연결하는 것이 반드시 해당 질문을 완전히 완벽하게 해결하지 못한 이유를 알려주지는 않습니다. – EdChum

답변

2

난 당신이 melt를 사용할 수 있다고 생각 :

df = pd.DataFrame({'ID':[2,3,4,5], 
        'Phone 1':['A', 'B', 'C', 'D'], 
        'Phone 2':['E', 'F', 'G', 'H'], 
        'Phone 3':['A', 'C', 'G', 'H']}) 
print (df) 
    ID Phone 1 Phone 2 Phone 3 
0 2  A  E  A 
1 3  B  F  C 
2 4  C  G  G 
3 5  D  H  H 

print (pd.melt(df, id_vars='ID', var_name='PhoneSource', value_name='Phone')) 
    ID PhoneSource Phone 
0 2  Phone 1  A 
1 3  Phone 1  B 
2 4  Phone 1  C 
3 5  Phone 1  D 
4 2  Phone 2  E 
5 3  Phone 2  F 
6 4  Phone 2  G 
7 5  Phone 2  H 
8 2  Phone 3  A 
9 3  Phone 3  C 
10 4  Phone 3  G 
11 5  Phone 3  H 

stack 또 다른 솔루션 :

df1 = df.set_index('ID').stack().reset_index() 
df1.columns = ['ID','PhoneSource','Phone'] 
print (df1) 
    ID PhoneSource Phone 
0 2  Phone 1  A 
1 2  Phone 2  E 
2 2  Phone 3  A 
3 3  Phone 1  B 
4 3  Phone 2  F 
5 3  Phone 3  C 
6 4  Phone 1  C 
7 4  Phone 2  G 
8 4  Phone 3  G 
9 5  Phone 1  D 
10 5  Phone 2  H 
11 5  Phone 3  H 
+0

감사합니다. 제비! 나는 녹은 기능이 있다는 것을 결코 깨닫지 못했다. 나는 R에서 알았을 뿐이다. 이것은 놀랍다. :) 나는 그것을 사용하지 않아서 스태킹 응답을 자세히 보게 될 것이다. 그러나 순간에 용융물이 작동하고 환상적입니다! –

+0

내가 한 라이너로 돌아갈 수 있다면 어떤 생각 이니? 나는 그것을 다른 열과 병합했으며 전화와이 새로운 열에 대해 3 개의 열을 갖길 원합니다. 스택 해제를 시도했지만 실제로 작동하지 않습니다. 감사! –

+0

[this solution] (http://stackoverflow.com/a/40529872/2901002)을 확인하실 수 있습니다. – jezrael

관련 문제