【问题标题】:Groupby certain number of rows pandasGroupby一定数量的行熊猫
【发布时间】:2017-10-17 13:16:12
【问题描述】:

我有一个数据框,假设有 2 列:日期和双精度数

 2017-05-01   2.5
 2017-05-02   3.5
 ...          ...
 2017-05-17   0.2
 2017-05-18   2.5

现在我想做一个 groupby 并用 x 行求和。因此,即返回 6 行:

 2017-05-06  15.6
 2017-05-12  13.4
 2017-05-18  18.0

是否有一个干净的解决方案可以做到这一点,而无需通过类似这样的 for 循环运行它:

 temp = pd.DataFrame()
 j = 0
 for i in range(0,len(df.index),6):
      temp[df.ix[i]['date']] = df.ix[i:i+6]['value'].sum()

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我猜你正在寻找重采样。考虑这个数据框

    rng = pd.date_range('2017-05-01', periods=18, freq='D')
    num = np.random.randint(5,size = 18)
    df = pd.DataFrame({'date': rng, 'val': num})
    
    df.resample('6D', on = 'date').sum().reset_index()
    

    会回来

        date        val
    0   2017-05-01  14
    1   2017-05-07  11
    2   2017-05-13  16
    

    【讨论】:

    • 我之前接受过,但是当我尝试您的示例时,我收到错误:TypeError: resample() got an unexpected keyword argument 'on' args = ("resample() got an unexpected keyword argument 'on' ",) with_traceback =
    • 我注意到我使用的是 pandas 0.17,升级后它确实有效。
    • 很抱歉我错过了两个 cmets,但很高兴它成功了
    【解决方案2】:

    这是使用 groupby 数据帧长度范围的替代解决方案。

    两列使用agg

    df.groupby(np.arange(len(df))//6).agg(lambda x: {'date': x.date.iloc[0], 
                                                     'value': x.value.sum()})
    

    多列您可以将first(或last)用于日期,将sum 用于其他列。

    group = df.groupby(np.arange(len(df))//6)
    pd.concat((group['date'].first(), 
               group[[c for c in df.columns if c != 'date']].sum()), axis=1)
    

    【讨论】:

    • 谢谢你的额外,但是当有超过 1 个值列时它是如何工作的,所以 groupby 会比 x.value.sum() 更好?
    • 我不确定我是否完全理解您的问题。这基本上是将 Dataframe 分组为 6 行并聚合这些行。我不确定它是否会比简单的总结更好。
    • 现在你有了 'value' : x.value.sum() ,但是如果数据框中有 12 列,这意味着你必须为每一列都写这个,而使用 groupby 这适用于所有一次。
    • 啊,我明白了!我会让我的答案更笼统:)
    • @user3605780,我更新了我的解决方案。希望现在更通用。
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2020-01-16
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多