【问题标题】:Creating new column in DataFrame with conditional rolling().mean()使用条件 rolling().mean() 在 DataFrame 中创建新列
【发布时间】:2020-12-22 16:56:27
【问题描述】:

我正在处理一个相当大的 DataFrame,并希望加快速度。我的数据格式如下:

Name Number
Condition 1 1
Condition 1 2
Condition 1 2.2
Condition 1 2
Condition 2 1
Condition 2 1.1
Condition 2 1.2
Condition 2 1.3

现在我想对数字应用滚动平均值,但不混合不同的条件。我的预期结果是:

Name Number Mean
Condition 1 1 nan
Condition 1 2 1.5
Condition 1 2.2 2.1
Condition 1 2 2.1
Condition 2 1 nan
Condition 2 1.1 1.05
Condition 2 1.2 1.15
Condition 2 1.3 1.25

我现在正在做的是遍历所有条件并将计算的平均值保存在不同的 Dataframe 中,例如:

mean = {}
for con in data["Name"].drop_duplicates():
   mean[con] = data[data["Name" == con]].rolling(window=2).mean()

但这总是需要几分钟,这就是为什么我正在寻找一种替代方法来直接创建列。我用 .apply 试过了,但这不起作用。至少到目前为止我尝试过的不是。

非常感谢!

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    Name分组,然后用滚动平均值变换Number

    df['Mean'] = df.groupby('Name')['Number'].transform(lambda x: x.rolling(window=2).mean())
    print(df)
    

    输出

              Name  Number  Mean
    0  Condition 1     1.0   NaN
    1  Condition 1     2.0  1.50
    2  Condition 1     2.2  2.10
    3  Condition 1     2.0  2.10
    4  Condition 2     1.0   NaN
    5  Condition 2     1.1  1.05
    6  Condition 2     1.2  1.15
    7  Condition 2     1.3  1.25
    

    【讨论】:

    • 如果没有transform,这项工作可以吗? df['Mean'] = df.groupby('Name')['Number'].rolling(window=2).mean())
    • @ScottBoston 我在使用该语法时遇到错误,我使用的是 '1.1.4'
    • @DaniMesejo 你是对的...df['Mean'] = df.groupby('Name', as_index=True)['Number'].rolling(2).mean().to_numpy() 有趣的group_keys=False 也没有做任何事情。我认为这在某一时刻有效。
    • Dani Mesejo 的解决方案在几秒钟内就能发挥作用:D,非常感谢,我猜应该早点问这个问题。我尝试了不带转换的 sn-p,但这确实会引发错误。
    • 我看到了问题,它创建了一个多索引。 df['Mean'] = df.groupby('Name')['Number'].rolling(window=2).mean().droplevel(0) 将是解决方案,如果我们出于某种原因想要避免转换。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2020-04-25
    • 2022-12-15
    • 2015-07-25
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多