我有一个稀疏的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
答案 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
),现在它也适用于aggfunc
每movieId
个userId
的情况。< / 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