将Sparse Pandas DataFrame转换为Dense DataFrame

时间:2016-03-16 21:05:36

标签: python pandas

我有一个稀疏的DataFrame:

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

2 个答案:

答案 0 :(得分:2)

你可以在传递相关cols的df上调用.pivot索引,列和值。在这里,我创建一个布尔df,因为NaN值会在没有值的地方引入,并将dtype强制转换为int以生成您想要的内容:

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

答案 1 :(得分:1)

您可以添加一列,然后只需使用df.pivot_table()

Indirect.Class

PS我已经应用了@ jezrael的更正(添加了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 ),现在它也适用于aggfuncmovieIduserId的情况。< / p>

证明:

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