2017-03-16 8 views
2

データマングン質問:過度に幅の広いDataFrameから特定の変数を選択的にピボットできますか?Python pandas:ワイドフォームDataFrameで特定の変数をピボットする

df1 = pd.DataFrame(
    [[1,'a','b',.1,-1,10], 
    [2,'a','b',.2,-3,12], 
    [3,'c','d',.3,-5,14]], 
    columns=['sample','id1','id2','x','y1','y2']) 
print df1 
# sample id1 id2 x y1 y2 
#0  1 a b 0.1 -1 10 
#1  2 a b 0.2 -3 12 
#2  3 c d 0.3 -5 14 

に:Xがコピーされていることを

# sample id position x y 
#0  1 a   1 0.1 -1 
#1  1 b   2 0.1 10 
#2  2 a   1 0.2 -3 
#3  2 b   2 0.2 12 
#4  3 c   1 0.3 -5 
#5  3 d   2 0.3 14 

注、yは位置と整列

例えば、Iターンたいです。

ストレートpd.melt()は、幅広い形式に簡単にピボットバックしない混合変数とデータ型を作成します。

print pd.melt(df1, id_vars='sample') 
# sample variable value 
#0  1  id1  a 
#1  2  id1  a 
#2  3  id1  c 
#3  1  id2  b 
#4  2  id2  b 
#5  3  id2  d 
#6  1  x 0.1 
#7  2  x 0.2 
#8  3  x 0.3 
#9  1  y1 -1 
#10  2  y1 -3 
#11  3  y1 -5 
#12  1  y2 10 
#13  2  y2 12 
#14  3  y2 14 

アドバイスはありますか?ありがとう!

答えて

3

あなたはこの試みることができます:

# set columns that don't change as index 
df1.set_index(['sample', 'x'], inplace=True) 

# create multi-index columns based on the names pattern 
df1.columns = pd.MultiIndex.from_arrays(df1.columns.str.extract(r"(\D+)(\d+)", expand=True).T.values) 

# transform the multi-index data frames to long format with stack 
df1.stack(level=1).rename_axis(('sample', 'x', 'position')).reset_index() 

enter image description here

+0

まず第一に、素晴らしい答えを。 df.columns.str.extract()は私にとって初めてのことですが、列名がもっと複​​雑な場合、例えば[''id1、f22'、 'id2、f22'、 'var50_a1'、 'var50_a2 '] '。適切なvar名/位置を抽出するためにregex-fuを使う必要がありますか? –

+0

正規表現では、簡単にリストアップしたように正規表現の列を扱うことはできません。たとえば、 'a1、a2、b1、b2、c1、c2'や' var1_a1、var1_a2 、var2_a1、var2_a2'はどちらも良いはずですが、後者は混じらないので、正規表現は '([^ _] +)_([^ _] +)'でなければなりません。だからあなたのカラム名が狂っていないことを確認することが助けになるでしょう。 – Psidom

+0

抽出する前に列の名前を変更するのに十分簡単で簡単です。 –

関連する問題