代码之家  ›  专栏  ›  技术社区  ›  Josh Friedlander

熊猫中的Groupby和interpolate

  •  2
  • Josh Friedlander  · 技术社区  · 6 年前

    我的数据有一个星期号、帐户id和几个使用列。我想a)按帐户ID分组,b)将每周数据重新采样为每日数据,c)平均插值每日数据(将每周数据除以7),然后将所有数据重新组合在一起。我把大部分都记下来了,但是 groupby 我有点困惑。它也很慢,这让我觉得这可能不是最佳的解决方案。

        Account Id  year week         views stats foo_col 
    31133   213     2017-03-05          4.0     2.0     11.0
    10085   456     2017-03-12          1.0     6.0     3.0
    49551   789     2017-03-26          1.0     6.0     27.0
    

    def interpolator(mini_df):
        mini_df = mini_df[cols_to_interpolate].set_index('year week')
        return mini_df.resample('D').ffill().interpolate() / 7
    
    example = list(grp)[0][1]
    interpolator(example) # This works perfectly
    
    df.groupby('Account Id').agg(interpolator)                # doesn't work
    df.groupby('Account Id').transform(interpolator)          # doesn't work
    
    for name,group in grp:
        group = group[cols_to_interpolate].set_index('year week')
        group = group.resample('D').ffill().interpolate() / 7 # doesn't work
    
    for acc_id in df['Account Id'].unique():
        mask = df.loc[df['Account Id'] == acc_id]
        print(df[mask])                                     # doesn't work
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   jezrael    6 年前

    我希望你的职能应该与 groupby 类似对象:

    df = (df.set_index('year week')
            .groupby('Account Id')[cols_to_interpolate]
            .resample('D')
            .ffill()
            .interpolate() / 7)
    

    来自评论的解决方案是不同的- interpolate

    df.groupby('Account Id').apply(interpolator)