Python 使用pandas创建pivot_表,但出现错误
我有这样一个数据帧的头部,我想制作一个pivot_表Python 使用pandas创建pivot_表,但出现错误,python,pandas,Python,Pandas,我有这样一个数据帧的头部,我想制作一个pivot_表 user_id item_id cate_id action_type action_date 0 11482147 492681 1_11 view 15 1 12070750 457406 1_14 deep_view 15 2 12431632 527476 1_1 view 15 3 13397746 5317
user_id item_id cate_id action_type action_date
0 11482147 492681 1_11 view 15
1 12070750 457406 1_14 deep_view 15
2 12431632 527476 1_1 view 15
3 13397746 531771 1_6 deep_view 15
4 13794253 510089 1_27 deep_view 15
有20000多个用户id,37个类别id,5个动作类型。
我想制作一个像这样的pivot\u表,我用excel来做。表中的值应该是每个用户id和每个cate\u id的值。
我尝试了以下代码
user_cate_table = pd.pivot_table(user_cate_table2,index = ['user_id','cate_id'],columns=np.unique(train['action_type']),values='action_type',aggfunc=np.count_nonzero,fill_value=0)
我收到了这个信息
ValueError: Grouper and axis must be same length
dataframe用户的头\u cate\u表2
user_id item_id cate_id action_type
0 11482147 492681 1_11 1.0
1 12070750 457406 1_14 2.0
2 12431632 527476 1_1 1.0
3 13397746 531771 1_6 2.0
4 13794253 510089 1_27 2.0
5 14378544 535335 1_6 2.0
6 1705634 535202 1_10 1.0
7 6943823 478183 1_3 2.0
8 5902475 524378 1_6 1.0
我认为您需要++:
另一个解决方案包括:
您不需要使用
pivot\u表
。您可以使用groupby
和unstack
df.groupby(['user_id', 'cate_id', 'action_type'])['action_date'].agg(np.count_nonzero).unstack('action_type')
pivot\u table
也起作用,但您没有误解columns=
参数
pd.pivot_table(df,index = ['user_id','cate_id'],columns=['action_type'],aggfunc=np.count_nonzero,fill_value=0)
什么是唯一的(列['action\u type'])?列与另一个数据帧的唯一值?是的,原始数据帧名为train。这就是我在topSo上显示的,有两个数据帧,需要使用它们
pivot\u table
?您可以添加具有所需输出的第二个数据帧的示例吗?谢谢。好的。事实上,数据帧用户_cate_table2是从数据帧序列转换而来的。我只是将不同的操作类型更改为不同的数字。所以您添加了所需的输出?我再次得出了与@jezrael相同的答案,他在我编译时发布了帖子mine@MaartenFabr谢谢。我检查了你的答案,结果有点不同,但我不知道OP想要的是我的解决方案还是你的。我认为.size
使用.np.count\u non zero
,所以归结起来是一样的,我没有使用fill\u值。其余的是comparable@Chunk_Ning-谢谢你的耐心;)
df.groupby(['user_id', 'cate_id', 'action_type'])['action_date'].agg(np.count_nonzero).unstack('action_type')
pd.pivot_table(df,index = ['user_id','cate_id'],columns=['action_type'],aggfunc=np.count_nonzero,fill_value=0)