2017-08-09 22 views
1

私はsas proc transposeを持っています。私はpandasで複製しようとしています。ここでPython Pandas Proc Transpose Equivalent

は一例です:

ID = ['ID1', 'ID1', 'ID1', 'ID1', 'ID1'] 
obs_week = [201701,201701,201701,201701,201701] 
weeks_id = [1,2,3,4,5] 
spend = [100,200,300,400,500] 
df = pd.DataFrame(zip(ID, obs_week, weeks_id, spend), columns = ['id', 'obs_week', 'weeks_id', 'spend']) 
df 

これは、このようなテーブルを与える:

id obs_week weeks_id spend 
0 ID1 201701  1   100 
1 ID1 201701  2   200 
2 ID1 201701  3   300 
3 ID1 201701  4   400 
4 ID1 201701  5   500 

私はID1とobs_weekが一意になるように、これを転置しようとしていますし、その後weeks_idが新しいとなり接頭辞付きの列。

SASのコードは次のようになります。

proc transpose data=spend out=spend_hh (drop = _label_ _name_) prefix=spend_; 
    by id obs_week; 
    id weeks_id; 
    var spend; 
run; 

私は私の問題がある。この

    spend 
weeks_id   1 2 3 4 5 
id  obs_week     
ID1  201701 100 200 300 400 500 

のようなテーブルを与えるdf.pivot_table

df.pivot_table(index=['id','obs_week'], columns='weeks_id', aggfunc=sum, fill_value=0) 

使用して近づくために管理しています1 2 3 4 5の名前をspend_1、spend_2などに変更したいのですが

私はまた、ファイル内の複数の異なる変数のためにこれをやってみたいけど、私はちょうど私が

私の答えは次のようになりたいだけのフィールドに選択を制限することができ前提としています

id obs_week spend_1 spend_2 spend_3 spend_4 spend_5 
0 ID1 201701  100  200  300  400  500 

ですこれはどういうわけかヘッダーをちょうど崩壊させますか?

idとobs_weekをインデックスの一部にしないことも忘れないでください。

答えて

0

あなたが最初にしてreset_indexインデックス付きの列のとrename_axis列名を作成するためのweeks_idテキスト削除のためのリストの内包必要があります。

df = df.pivot_table(index=['id','obs_week'], columns='weeks_id', aggfunc=sum, fill_value=0) 

df.columns = ['{}_{}'.format(x[0], x[1]) for x in df.columns] 
df = df.reset_index().rename_axis(None, axis=1) 
print (df) 
    id obs_week spend_1 spend_2 spend_3 spend_4 spend_5 
0 ID1 201701  100  200  300  400  500 

または:

df.columns = ['_'.join((x[0], str(x[1]))) for x in df.columns] 
df = df.reset_index().rename_axis(None, axis=1) 
print (df) 
    id obs_week spend_1 spend_2 spend_3 spend_4 spend_5 
0 ID1 201701  100  200  300  400  500 
1

はここでシングルライナー

です
In [1446]: (df.pivot_table(index=['id', 'obs_week'], columns=['weeks_id'], values='spend') 
       .add_prefix('spend_') 
       .reset_index()) 
Out[1446]: 
weeks_id id obs_week spend_1 spend_2 spend_3 spend_4 spend_5 
0   ID1 201701  100  200  300  400  500 

または

In [1449]: (df.pivot_table(index=['id', 'obs_week'], columns=['weeks_id'], values='spend') 
       .add_prefix('spend_') 
       .reset_index() 
       .rename_axis(None, axis=1)) 
Out[1449]: 
    id obs_week spend_1 spend_2 spend_3 spend_4 spend_5 
0 ID1 201701  100  200  300  400  500