2016-05-10 15 views
1

私はPandasdataframeを持っています。これは、1月と2月にどれだけの金額を費やしたかを示しています。 groupby関数を使用して月ごとに人をグループ化したいのですが、私のコードは実際のデータフレームではなくDataFrameGroupBy objectです。私はまた、私はちょうどその場所に残したいと思う性別のコラムを持っています。パンダのGroupbyは、DataframeではなくGroupbyオブジェクトを生成します

コード:

import pandas as pd 
df = pd.DataFrame(data=[['Person A', 5, 21, 'Male'], ['Person B', 15, 3, 'Female']], columns=['Names', 'Jan', 'Feb', 'Gender']) 
print df.groupby(['Names', 'Jan', 'Feb']) 

出力:

<pandas.core.groupby.DataFrameGroupBy object at 0x020D4470> 

データフレームの開始:

 Names Jan Feb Gender 
0 Person A 5 21 Male 
1 Person B 15 3 Female 

所望の出力:

  Names Value Gender 
0 Person A - Jan  5  Male 
1 Person A - Feb  21  Male 
2 Person B - Jan  15  Female 
3 Person B - Feb  3  Female 

答えて

2

スタックを使用して別の解決策。

df_out = df.set_index(['Names']).stack().to_frame().reset_index() 
df_out.columns = ['Names','month','value'] 

編集

また、これは動作するはずです:私はmelt` `精通しなかった

stack_df = df.set_index(['Names', 'Gender']).stack().to_frame().reset_index() 
stack_df.columns = ['Names','Gender','Month', 'Value'] 
+0

@jezrael私はあなたのコメントに従うかどうかわからない... – flyingmeatball

3

あなたは、その後、sort_valuesmeltを使用することができますconcanecate列と最後のdropvariable

df1 = pd.melt(df, id_vars='Names').sort_values('Names') 
df1['Names'] = df1['Names'] + '- ' + df1['variable'] 
df1 = df1.drop('variable', axis=1) 
print df1 
      Names value 
0 Person A- Jan  5 
2 Person A- Feb  21 
1 Person B- Jan  15 
3 Person B- Feb  3 

assignともう1つのラインソリューション:

print pd.melt(df, id_vars='Names').sort_values('Names') 
     .assign(Names = lambda x: x['Names'] + '- ' + x['variable']) 
     .drop('variable', axis=1) 

      Names value 
0 Person A- Jan  5 
2 Person A- Feb  21 
1 Person B- Jan  15 
3 Person B- Feb  3 

EDIT:

あなたは新しい列を追加することができますパラメータにid_vars

df1 = pd.melt(df, id_vars=['Names', 'Gender']).sort_values('Names') 
df1['Names'] = df1['Names'] + '- ' + df1['variable'] 
df1 = df1.drop('variable', axis=1) 
df1 = df1[['Names','value','Gender']] 
print df1 
      Names value Gender 
0 Person A- Jan  5 Male 
2 Person A- Feb  21 Male 
1 Person B- Jan  15 Female 
3 Person B- Feb  3 Female 

一行ソリューションあなたが列の順序を変更が必要な場合は、reindex_axisを使用します。

print pd.melt(df, id_vars=['Names', 'Gender']) 
     .sort_values('Names') 
     .assign(Names = lambda x: x['Names'] + '- ' + x['variable']) 
     .drop('variable', axis=1) 
     .reindex_axis(['Names','value','Gender'], axis=1) 

      Names value Gender 
0 Person A- Jan  5 Male 
2 Person A- Feb  21 Male 
1 Person B- Jan  15 Female 
3 Person B- Feb  3 Female 
+0

感謝を。その解決策で私の質問は過度に簡素化されたので、元のままにしたいと思っていた列が1つあったので、私は元のものに変更しました。 – user2242044