2016-11-01 4 views
1

ID、Phone1、Phone2、およびPhone3という4つの列を持つデータフレームがあります。 ID、電話、PhoneSourceという3つの列を持つ新しいデータフレームを作成したいと考えています。 私はthis questionのように追記した場合は:Pandas - 列名を維持しながら列を1つにマージする

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

を、私は私が何をしたいの半分を取得:すべての電話番号は、同じ列にあります。しかし、私はどのようにソースを保持するのですか?

+1

あなたは2つのDFSとどのような所望の出力ルックスは避けたいを作成するために、生データとコードを投稿することができますあいまいさ – EdChum

+0

私はあなたのポイント@EdChumを見ますが、私がリンクした前の質問は文脈を与えていると思いました。しかし、私のところで怠惰な、私は認めます! –

+0

ここでのフォームは、あなたの問題と望ましい結果を再現するコードを投稿することです。関連する質問にリンクしても、なぜその質問があなたの特定の例を完全に解決しなかったのかを必ずしも知らせてくれるわけではありません。 – EdChum

答えて

2

私はあなたがmeltを使用することができると思う:stack

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 

別の解決策:

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

私は1つのライナーに戻ることができますか?私は別の列にそれをマージし、今は携帯電話とこの新しい列の3つの列を持っていると思います。私はアンスタックを試みましたが、実際には機能しません。ありがとう! –

+0

あなたは[この解決策](http://stackoverflow.com/a/40529872/2901002)をチェックすることができます – jezrael

関連する問題