【问题标题】:Pandas - directly add moving average columns from group by to dataframePandas - 直接将移动平均列从分组添加到数据帧
【发布时间】:2018-09-16 11:26:23
【问题描述】:

我有一个包含以下列的数据框:

name, date, day_index, value

我想在同一个数据框中添加第 4 列,它是每个名称的第 3 列(值)的指数加权移动平均值,按第一个日期排序,然后按 day_index 排序。我可以使用以下代码将其生成为一个系列。

df.sort_values(['date','day_index'],inplace=True)

ecw_series = df.groupby('name').apply(lambda x: 
x["value"].ewm(halflife=2).mean())

但是,如果我尝试直接将其添加到原始数据框中,则会收到以下错误:

df['ecw'] =  df.groupby('name').apply(lambda x: 
x["value"].ewm(halflife=2).mean())



incompatible index of inserted column with frame index

如果我尝试将系列与数据框合并,我会收到以下错误:

df['index'] = df.index

df = df.merge(ecw_series, left_on=['name','index'],right_index=True)

can not merge DataFrame with instance of type <class 
'pandas.core.series.Series'

此时,我正在考虑将系列转换为数据框,然后合并。但我相信一定有更好的方法。

【问题讨论】:

    标签: python pandas pandas-groupby moving-average split-apply-combine


    【解决方案1】:

    以下方法有效:

    df['ecw'] = model_df.groupby('name')['value'].apply(lambda x: 
     x.ewm(halflife=2).mean())
    

    为什么您不能在 Lambda 函数中引用“值”列,我仍然有些困惑。

    【讨论】:

    • 如果按列引用,则必须指定axis=1:ecw_series = df.groupby('name').apply(lambda x: x["value"].ewm(halflife=2).mean(), axis=1)
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2018-02-23
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多