2016-05-16 116 views
0

在一个jupyter笔记本中,我有一个从不同的合并数据集创建的数据框。Python /熊猫:枢轴表

record_id | song_id | user_id | number_times_listened 

0   |ABC  | Shjkn4987 |   3 
1   |ABC  | Dsfds2347 |   15 
2   |ABC  | Fkjhh9849 |   7 
3   |XYZ  | Shjkn4987 |   20 
4   |XXX  | Shjkn4987 |   5 
5   |XXX  | Swjdh0980 |   1 

我想创建由song_id透视表数据框中列出user_ids的数量和number_times_listened总和。

我知道我需要用count和sum函数创建一个for循环,但是我不能让它工作。我也尝试了熊猫模块的pd.pivot_table。

df = pd.pivot_table(data, index='song_ID', columns='userID', values='number_times_listened', aggfunc='sum') 

或者类似的东西?

total_user=[] 
total_times_listened =[] 
for x in data: 
    total_user.append(sum('user_id')) 
    total_times_listened.append(count('number_times_listened')) 
return df('song_id','total_user','total_times_listened') 

回答

1

您可以通过列名作为键的字典和值的函数列表:

df.groupby('song_id').agg(funcs) 

输出:

funcs = {'number_times_listened':['sum'], 'user_id':['count']} 

然后只需song_id列中使用df.groupby

number_times_listened user_id 
     sum count 
song_id   
ABC  25 3 
XXX  6 2 
XYZ  20 1 
+0

完美工作!谢谢! – jeangelj

+0

对于我的机器学习模型,我需要有一个标题行 - 在这种情况下,我有3个。我一直试图修复它在python中没有成功。尝试删除2个标题行,并有一个行为behavior_df.columns = ['song_id','play_count_sum','user_id_count'] – jeangelj

0

不确定这是否相关,但示例中的列名和外壳与您的Python代码不匹配。

在任何情况下,我下面的作品上的Python 2.7:

CSV文件:

record_id song_id user_id number_times_listened 
0 ABC Shjkn4987 3 
1 ABC Dsfds2347 15 
2 ABC Fkjhh9849 7 
3 XYZ Shjkn4987 20 
4 XXX Shjkn4987 5 
5 XXX Swjdh0980 1 

Python代码:

csv_data = pd.read_csv('songs.csv') 

df = pd.pivot_table(csv_data, index='song_id', columns='user_id', values='number_times_listened', aggfunc='sum').fillna(0) 

得到的数据透视表的外观如:

user_id Dsfds2347 Fkjhh9849 Shjkn4987 Swjdh0980 
song_id 
ABC    15   7   3   0 
XXX    0   0   5   1 
XYZ    0   0   20   0 

这是你在找什么?请记住,song_id,user_id对在您的数据集中是唯一的,因此在此特定示例中,聚合函数实际上没有做任何事情,因为在这两列上没有任何东西可以分组。

+0

这很好,虽然我不是在寻找这个,它实际上给了我这么我新的机会 - 谢谢你 – jeangelj