2017-02-20 19 views
0

これはおそらく簡単な方法ですので、誰かがいい解決策を取ってくれることを願っています(現在私はループのために醜いです)。複数の列を2つの列にまとめる: "列名"と "値"

私のデータは次のようになります。

In [1]: df = pd.DataFrame({'Ref': [5, 6, 7], 
          'Col1': [10,11,12], 
          'Col2': [20,21,22], 
          'Col3': [30,31,32]}) 

In [2]: df 
Out[2]: 
    Col1 Col2 Col3 Ref 
0 10 20 30 5 
1 11 21 31 6 
2 12 22 32 7 

そして、私は、対応するRefを維持しながら、列IDと実際の値のための1つの列に対して単一の列を使用する(2Dヒストグラムのための)テーブルを平らにしようとしています、次のように:

Ref Col Value 
0 5 1 10 
1 5 2 20 
2 5 3 30 
3 6 1 11 
4 6 2 21 
5 6 3 31 
6 7 1 12 
7 7 2 22 
8 7 3 32 

私は逆の操作を行うに参加する/グループ操作のいくつかの種類があった覚えているが、私はもうそれを思い出すことができない...

答えて

1

最も洗練されたソリューションではないかもしれませんが、それはあなたのデータに作用します。 pivot_tableとstackの組み合わせを使用します。

import pandas as pd 

df = pd.DataFrame({'Ref': [5, 6, 7], 
          'Col1': [10,11,12], 
          'Col2': [20,21,22], 
          'Col3': [30,31,32]}) 
# In [23]: df 
# Out[23]: 
#  Col1 Col2 Col3 Ref 
# 0 10 20 30 5 
# 1 11 21 31 6 
# 2 12 22 32 7 

piv = df.pivot_table(index=['Ref']).stack() 
df2 = pd.DataFrame(piv) 
df2.reset_index(inplace=True) 
df2.columns = ['Ref','Col','Value'] 

# In [19]: df2 
# Out[19]: 
#  Ref Col Value 
# 0 5 Col1  10 
# 1 5 Col2  20 
# 2 5 Col3  30 
# 3 6 Col1  11 
# 4 6 Col2  21 
# 5 6 Col3  31 
# 6 7 Col1  12 
# 7 7 Col2  22 
# 8 7 Col3  32 

あなただけの列名の最後の桁であることを「コル」は、このような何か行うことができますしたい場合:

df2.Col = df2.Col.apply(lambda x: x[-1:]) 

# In [21]: df2 
# Out[21]: 
#  Ref Col Value 
# 0 5 1  10 
# 1 5 2  20 
# 2 5 3  30 
# 3 6 1  11 
# 4 6 2  21 
# 5 6 3  31 
# 6 7 1  12 
# 7 7 2  22 
# 8 7 3  32 
+0

おかげで、これは間違いなくはるかにエレガントな私のループソリューションのためのより。 ) – tamasgal

+0

問題はありません@tamasgal!これがうまくいく場合は、私の答えを受け入れることができますか?ありがとう! – jspring

+0

確かに、心配する必要はありません、私は通常、他の答えが来たら少し待っていますが、そうではないようです;) – tamasgal

関連する問題