2017-04-04 76 views
2

我有一排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 

我想生產,其中第一觀察被分配到第一回合,第二到第二輪,以此類推一個數據幀。所以,結果會是什麼樣子:

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

您可以使用groupbyapply創建新列:

#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 

pivotunstack另一種解決方案:

#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,它將按順序爲每個用戶編號條目。
  • 將索引設置爲列USERROUND
  • 最後,拆除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') 
    )