我在 MySQL 数据库中有一个大型音乐标签数据集,我正在尝试用 pandas 进行分析。我将它从 MySQL 导出到 .tsv,现在将其作为数据框读取以进行分析。
数据中的每一行都是一个元组,指示给定用户(由数字用户 ID 表示)在特定时间用特定标签(在此表示为数字 ID)标记了特定艺术家。因此,在没有索引的情况下,数据样本将如下所示:
uid artist tag date
0 2096963 559 46 2005-07-01
1 2096963 584 1053 2005-07-01
2 2096963 584 2044 2005-07-01
3 2096963 584 2713 2005-07-01
4 2096963 596 236 2005-07-01
...
uid artist tag date
99995 2656262 8095 57 2005-08-01
99996 2656262 8095 79 2005-08-01
99997 2656262 8095 4049 2005-08-01
99998 2656262 8095 8290 2005-08-01
99999 2610168 8095 1054 2005-08-01
为了便于分析,我对所有内容进行了索引并添加了一个虚拟注释变量(数据中的每一行代表一个标记实例或注释)。所以现在我们有:
data = pd.read_table(filename,header=None, names=('uid','artist','tag','date'), index_col=['date','uid','artist','tag'], parse_dates='date')
data['annotations'] = 1
In [41]: data.head()
Out[41]:
annotations
date uid artist tag
2005-07-01 2096963 559 46 1
584 1053 1
2044 1
2713 1
596 236 1
...
使用这样格式化的数据,计算简单的频率分布是微不足道的。例如,如果我想确定每个用户标记某物的次数(按频率降序排列),它很简单:
data.sum(level='uid').sort('anno',ascending=False)
同样,我可以通过以下方式确定每个月(所有用户和标签)的注释总数:
data.sum(level='date')
但是我在进行更复杂的计算时遇到了麻烦。特别是,如果我想要每个用户每个月的平均注释数怎么办?如果我打电话:
data.sum(level=['date','uid']).head()
我每个月得到每个用户的注释数量,即:
anno
date uid
2005-07-01 1040740 10
1067454 23
2096963 136
2115894 1
2163842 4
...
但是有什么简单的方法可以让用户获得这些值的每月平均值?也就是说,对于每个月,“anno”列的用户的平均值是多少?我有各种像这样的指标要计算,所以我希望解决方案能够推广。