有条件的滚动平均值(面试题)

问题描述 投票:0回答:1

我在面试时遇到了这个问题,想不出解决办法。这就是问题所在,假设您有一个如下的数据集(它超出了时间 2,但这只是一个可以使用的示例):

import pandas as pd

data = pd.DataFrame({
    'time': [1, 1, 1, 2, 2, 2],
    'names': ["Andy", "Bob", "Karen", "Andy", "Matt", "Sim"],
    'val': [1, 2, 3, 5, 6, 8]
})

编写一个函数来计算每个时间点之前的值的平均值,但不计算重复的名称。也就是说,对于时间 1,平均值为 (1+2+3)/3,对于时间 2,我不包括 Andy 的第一个值“1”,我只包括最近的值,因此时间 2 的平均值为 (2 +3+5+6+8)/5.

我尝试创建两个字典,一个存储“时间”计数,另一个跟踪“名称”和“值”,但我不知道如何从那里继续或如何提出有效的解决方案,所以我不会在每一步重新计算平均值(这是面试的另一个要求)。

它不一定是 pandas 解决方案,数据形式可以是您喜欢的任何形式。我只是将它作为 pandas df 呈现。

python hashmap
1个回答
0
投票

IIUC,您想要计算截至当前时间的值的

mean
,同时仅考虑最后看到的重复项(如果有)。如果是这样,这是一个潜在的选择,在 for 循环 中使用 boolean indexing 来构建扩展窗口:

# uncomment if necessary
# data.sort_values("time", inplace=True)

to_keep = "last" # duplicate

means = {}
for t in data["time"].unique():
    window = data.loc[data["time"].le(t)]
    m = ~window["names"].duplicated(to_keep)
    means[t] = window.loc[m, "val"].mean()

输出(

means
):

{ # time|mean
    1: 2.0, #  (1+2+3)/3
    2: 4.8, #  (2+3+5+6+8)/5
}
© www.soinside.com 2019 - 2024. All rights reserved.