2016-05-20 9 views
3

このサンプルでは、​​列ではなく列に焦点を当てるように、以前はデータベース形式(選択肢ではありません)のデータフレームを使用しています。pandas:行データを列データに整形してグループ化する

df = pd.DataFrame([['John','Sept',1,'Dec',2],['Jane','Sept',1,'Dec',3],['James','Sept',2,'Dec',2]],columns=['Name','Test 1','Score 1','Test 2','Score 2']) 

    Name Test 1 Score 1 Test 2 Score 2 
0 John Sept  1 Dec  2 
1 Jane Sept  1 Dec  3 
2 James Sept  2 Dec  2 

私はこの形式に変換したいと思います。

Name Test Date Score 
0 Joe  1 Sept  1 
1 Joe  2 Dec  2 
3 Jane  1 Sept  1 
4 Jane  2 Dec  3 
6 James  1 Sept  2 
7 James  2 Dec  2 

基本的に、名前列にグループ化するようにテスト列をマージしたいと思います。これまでのところ私は私が探していたものを()、ソートの私を得た溶融で()を見て、アンスタックしました:私はかなり確信している

melt = pd.melt(df,id_vars=['Name','1st Test']) 

    Name Test 1 variable value 
0 John Sept Score 1  1 
1 Jane Sept Score 1  1 
2 James Sept Score 1  2 
3 John Sept Test 2 Dec 
4 Jane Sept Test 2 Dec 
5 James Sept Test 2 Dec 
6 John Sept Score 2  2 
7 Jane Sept Score 2  3 
8 James Sept Score 2  2 

いずれかGROUPBY、溶融、またはそこに私を取得しますアンスタック、しかし、私は構文の権利を得ることができません。提案は非常に高く評価されます。

背景:この新しいフォーマットは、スコアの変化とテストの時間をグラフ化することができると思います(希望します)。

+0

ペア標本t検定は、それだけ 'scipy.stats.ttest_relで元の形式に非常に簡単になるだろう (DF [「1スコア​​」]、DFは[「2スコア」]) '。 – Neapolitan

+0

ありがとう、私はそれを見てみましょう!残念ながら、これらの人々はt検定を望んでおらず、後で使用できるようにExcelで作ったきれいなグラフが欲しく、現在の形式は特にExcelに優しいようではありません。 – ale19

答えて

2

あなたはsort_valueslreshapeを使用することができます。

df['T1'] = 1 
df['T2'] = 2 

df = (pd.lreshape(df, {'Test': ['T1', 'T2'], 
         'Date': ['Test 1', 'Test 2'], 
         'Score': ['Score 1', 'Score 2']})) 

#reorder columns, sort dataframe by Name 
df = df[['Name','Test','Date','Score']].sort_values('Name', ascending=False) 
print (df) 

    Name Test Date Score 
0 John  1 Sept  1 
3 John  2 Dec  2 
1 Jane  1 Sept  1 
4 Jane  2 Dec  3 
2 James  1 Sept  2 
5 James  2 Dec  2 

pd.lreshapeは非常によく文書化されていますが、使用することができません:

In [95]: help (pd.lreshape) 

In [96]: Help on function lreshape in module pandas.core.reshape: 

lreshape(data, groups, dropna=True, label=None) 
    Reshape long-format data to wide. Generalized inverse of DataFrame.pivot 

    Parameters 
    ---------- 
    data : DataFrame 
    groups : dict 
     {new_name : list_of_columns} 
    dropna : boolean, default True 

    Examples 
    -------- 
    >>> import pandas as pd 
    >>> data = pd.DataFrame({'hr1': [514, 573], 'hr2': [545, 526], 
    ...      'team': ['Red Sox', 'Yankees'], 
    ...      'year1': [2007, 2008], 'year2': [2008, 2008]}) 
    >>> data 
     hr1 hr2  team year1 year2 
    0 514 545 Red Sox 2007 2008 
    1 573 526 Yankees 2007 2008 

    >>> pd.lreshape(data, {'year': ['year1', 'year2'], 'hr': ['hr1', 'hr2']}) 
      team hr year 
    0 Red Sox 514 2007 
    1 Yankees 573 2007 
    2 Red Sox 545 2008 
    3 Yankees 526 2008 

    Returns 
    ------- 
    reshaped : DataFrame 
0

あり、おそらくこれらの機能を使用するには、いくつかの方法があり、 2つのデータフレームに分割してからappend()を使ってスタックすることで、それらを使わずに実行できます。

df = pd.DataFrame([['John','Sept',1,'Dec',2],['Jane','Sept',1,'Dec',3],['James','Sept',2,'Dec',2]],columns=['Name','Test 1','Score 1','Test 2','Score 2']) 

# split off frame 1 
df1 = df.loc[:,['Name','Test 1','Score 1']] 
df1.columns = ['Name','Date','Score'] 
df1['Test'] = 1 
df1 
Out[4]: 
Name Date Score Test 
John Sept 1  1 
Jane Sept 1  1 
James Sept 2  1 

# split off frame 2 
df2 = df.loc[:,['Name','Test 2','Score 2 
df2 = df.loc[:,['Name','Test 2','Score 2']] 
df2.columns = ['Name','Date','Score'] 
df2['Test'] = 2 
df2 
Out[5]: 
Name Date Score Test 
John Dec  2  2 
Jane Dec  3  2 
James Dec  2  2 

# combine the two frames 
df = df1.append(df2) 
df.sort_values('N 
df = df1.append(df2) 
df.sort_values('Name') 
Out[6]: 
Name Date Score Test 
James Sept 2  1 
James Dec  2  2 
Jane Sept 1  1 
Jane Dec  3  2 
John Sept 1  1 
John Dec  2  2 
関連する問題