2016-03-16 227 views
0

我有稀疏數據幀:轉換稀疏熊貓據幀到密集數據幀

df = pd.DataFrame([[1, 1],[1, 2], [2,1], [2,3], [3,4]], columns=['userId', 'movieId']) 

,看起來像這樣:

userId movieId 
0  1  1 
1  1  2 
2  2  1 
3  2  3 
4  3  4 

我想這個錶轉換,使它看起來像這樣:

   movieId 
userId  1  2 3 4 
    1  1  1 0 0 
    2  1  0 1 0 
    3  0  0 0 1 

回答

1

您可以通過DF爲索引,列和值相關的cols通話.pivot。在這裏,我創建一個布爾DF因爲那裏有沒有值將被引入NaN值,並投了dtypeint生成你的願望:

In [9]: 
(df.pivot(index='userId', columns='movieId', values='movieId') > 0).astype(int) 

Out[9]: 
movieId 1 2 3 4 
userId    
1  1 1 0 0 
2  1 0 1 0 
3  0 0 0 1 

這裏是中間透視表的樣子:

In [11]: 
df.pivot(index='userId', columns='movieId', values='movieId') 

Out[11]: 
movieId 1 2 3 4 
userId     
1   1 2 NaN NaN 
2   1 NaN 3 NaN 
3  NaN NaN NaN 4 
+0

完美和pythonic – slaw

0

您可以添加一列,然後簡單地使用df.pivot_table()

In [196]: df['count'] = 1 


In [198]: df.pivot_table(index='userId', columns='movieId', values='count', aggfunc='count', fill_value=0) 
Out[198]: 
movieId 1 2 3 4 
userId 
1  1 1 0 0 
2  1 0 1 0 
3  0 0 0 1 

PS我已經申請@ jezrael的校正(添加aggfunc),現在它也將工作的地方有一個以上的movieIduserId案件。

證明:

In [236]: df.loc[5]=[1,1,1] 

In [237]: df 
Out[237]: 
    userId movieId count 
0  1  1  1 
1  1  2  1 
2  2  1  1 
3  2  3  1 
4  3  4  1 
5  1  1  1 

In [238]: df.pivot_table(index='userId', columns='movieId', aggfunc='count', fill_value=0) 
Out[238]: 
     count 
movieId  1 2 3 4 
userId 
1   2 1 0 0 
2   1 0 1 0 
3   0 0 0 1 
+0

我明白了 - 你絕對是對的,謝謝!我會更新我的答案。 – MaxU