2017-04-04 8 views
2

私が個人ごとにすべての観測のための1つの行でCSVを有する:観測時刻をシーケンス番号に変換して変換しますか?

USER DATE SCORE 
1 7/9/2015 37.2 
1 11/18/2015 68.9 
2 7/7/2015 45.1 
2 11/2/2015 42.9 
3 6/4/2015 56 
3 10/27/2015 39 
3 5/11/2016 42.9 

Iは等、最初の観察は、1つを丸めるために割り当てられているデータフレームを生成するように二つを丸くするための第2、及びたいです。だから、結果は次のようになります。

USER R1  R2  R3 
1  37.2 68.9 NaN 
2  45.1 42.9 NaN 
3  56  39  42.9 

私はpd.pivotとpd.unstackの周りプレイしましたが、私は必要なものを得ることができません。

提案? USERDATEによって

答えて

0

あなたは新しい列を作成するためのapplygroupbyを使用することができます:pivotunstack

#if necessary sort values 
df = df.sort_values(by=['USER','DATE']) 

df = df.groupby('USER')['SCORE'].apply(lambda x: pd.Series(x.values)) 
     .unstack() 
     .rename(columns = lambda x: 'R' + str(x+1)) 
     .reset_index() 
print (df) 
    USER R1 R2 R3 
0  1 37.2 68.9 NaN 
1  2 45.1 42.9 NaN 
2  3 56.0 39.0 42.9 

別の解決策:

#if necessary sort values 
df = df.sort_values(by=['USER','DATE']) 

df = pd.pivot(index=df['USER'],columns=df.groupby('USER').cumcount() + 1,values=df['SCORE']) 
     .add_prefix('R') 
     .reset_index() 
print (df) 
    USER R1 R2 R3 
0  1 37.2 68.9 NaN 
1  2 45.1 42.9 NaN 
2  3 56.0 39.0 42.9 
0
  • まずソート値(これは例のデータですでに行われているようですが、念のため)。
  • 次に、すべてのユーザーのエントリに順番に番号を付ける新しい列ROUNDを作成します。
  • インデックスをカラムUSERおよびROUNDに設定します。
  • 最後に、SCORE列をアンスタックします。

ここではいくつかのサンプルコードです。

import pandas as pd 
from io import StringIO 

data = '''USER DATE SCORE 
1 7/9/2015 37.2 
1 11/18/2015 68.9 
2 7/7/2015 45.1 
2 11/2/2015 42.9 
3 6/4/2015 56 
3 10/27/2015 39 
3 5/11/2016 42.9''' 
df = (pd.read_csv(StringIO(data),sep='\s+',parse_dates=['DATE']) 
     .sort_values(by=['USER','DATE']) 
     .assign(ROUND = lambda x: x.groupby('USER').cumcount() + 1) 
     .set_index(['USER','ROUND'])['SCORE'] 
     .unstack() 
     .add_prefix('R') 
    ) 
関連する問題