我有一个带有两个元素的层次结构索引的“熊猫”数据框(“ month”和“ item_id”).每行表示特定月份的特定项目,并具有用于关注多个数值度量的列.具体细节无关紧要,因此我们仅出于此目的说我们有X列.
我的问题源于一个事实,即项目在其观察的月份中有所不同,这可能是连续的,也可能不是连续的.我需要计算第一个,第二个,…,第n个月中所有项目的X平均值,其中该项目有一个观测值.
换句话说,结果的第一行应该是数据框中第一行所有项目的平均值,第二条结果应该是第二个观测值所有项目的平均值,依此类推.
换句话说,如果我们要获取每个项目的所有按日期排序的行,并从i = 1,2,…,n对其进行索引,那么我需要获得所有行1,2的值的平均值, …,n.也就是说,我想要所有项目中每个项目的第一观察值的平均值,所有项目中第二个观察值的平均值,依此类推.
我怎样才能最好地做到这一点?我无法使用现有的日期索引,因此我是否需要向数据框添加另一个索引(类似于我在上一段中描述的内容),或者我唯一的办法是遍历每个项目的行并保持运行平均值?这会起作用,但无论如何都不会利用熊猫的力量.
添加一些示例数据:
item_id date X DUMMY_ROWS
20 2010-11-01 16759 0
2010-12-01 16961 1
2011-01-01 17126 2
2011-02-01 17255 3
2011-03-01 17400 4
2011-04-01 17551 5
21 2007-09-01 4 6
2007-10-01 5 7
2007-11-01 6 8
2007-12-01 10 9
22 2006-05-01 10 10
2006-07-01 13 11
23 2006-05-01 2 12
24 2008-01-01 2 13
2008-02-01 9 14
2008-03-01 18 15
2008-04-01 19 16
2008-05-01 23 17
2008-06-01 32 18
为了说明起见,我添加了数据中不存在的虚拟行列.我正在描述的操作将有效地给出行0、6、10、12和13的平均值(每个项目的第一个观察值),然后给出行1,7、11和15的平均值(对于每个项目,但不包括项目23,因为它只有一个观测值),依此类推.
解决方法:
一种选择是重置索引,然后按ID分组.
df_new = df.reset_index()
df_new.groupby(['item_id']).X.agg(np.mean)
这样就可以保持原始df的完整性,并获得每个项目ID的所有月份的平均值.
对于您更新的问题(顺便说一句,很好的例子),我认为方法是添加“ item_sequence_id”,我已经在路径中使用了类似的数据.
df.sort(['item_id', 'date'], inplace = True)
def sequence_id(item):
item['seq_id'] = range(0,len(item)-1,1)
return item
df_with_seq_id = df.groupby(['item_id']).apply(sequence_id)
df_with_seq_id.groupby(['seq_id']).agg(np.mean)
这里的想法是seq_id允许您确定每个item_id数据时间点的位置,为这些项目分配非唯一的seq_id值将允许您跨多个项目进行分组.我之前使用过的上下文与用户在会话中首先执行某项操作有关.使用此ID结构,我可以识别用户执行的所有第一,第二,第三等操作,而无需考虑他们的绝对时间和用户ID.
希望这是您想要的更多.
标签:pandas,python