【问题标题】:python way to groupby given sub levels of interest给定子兴趣级别的python分组方式
【发布时间】:2021-02-03 12:57:32
【问题描述】:

给定如下所示的 pandas 数据框,我想对“用户”进行某种分组,但在时间列上使用特殊定义的子标准对金额列求和。

   amount  time users
0      11     0     A
1      23    10     A
2      12    20     A
3      34    30     A
4      56    40     B
5      77    50     B
6      89    60     C

为此,我有成对的 range_start 和 range_end,例如在元组列表或类似列表中。这些时间列的 sub_group_ranges 应该使我能够在数据框中的每个批次上应用 groupby().sum。

sub_group_ranges = [(0,0),(20,30),(40,50),(60,60)]

结果应如下所示。每个用户的间隔计数是任意的。

   sum_amount_on_timerange user
0                       57    A
1                      133    B
2                       89    C

我发现这个post 很相似,但如果我没有连续的间隔意味着第一个间隔的结束不是下一个间隔的开始,我不明白如何使用它。

如果有人知道要寻找什么,那就太好了。 非常感谢

【问题讨论】:

    标签: python pandas group-by aggregate-functions


    【解决方案1】:

    我不确定我是否完全理解您要执行的操作,但这里有一些可行的方法

    df = pd.DataFrame([users,time]).T
    df.columns = ['users','time']
    
    def filter_time_range(ele,trange):
        if (ele>trange[0]) and (ele<=trange[1]):
            return ele
        else:
            return np.nan
       
    sub_group_ranges = [(0,0),(20,30),(40,50),(60,60)]
    for trange in sub_group_ranges:
        df[str(trange)] = df['time'].apply(lambda x: filter_time_range(x,trange))
        
    df
    

    导致

      users time    (0, 0)  (20, 30)    (40, 50)    (60, 60)
    0   A   0        NaN     NaN           NaN      NaN
    1   A   10       NaN     NaN           NaN      NaN
    2   A   20       NaN     NaN           NaN      NaN
    3   A   30       NaN     30.0           NaN     NaN
    4   B   40       NaN     NaN           NaN      NaN
    5   B   50       NaN     NaN           50.0     NaN
    6   C   60       NaN     NaN           NaN      NaN
    

    连同您的用户分组

    df.groupby(['users']).sum()
    
    
      (0, 0)    (20, 30)    (40, 50)    (60, 60)
    users               
    A     0.0    30.0   0.0     0.0
    B     0.0    0.0    50.0    0.0
    C     0.0    0.0    0.0     0.0
    

    我已将 amount 从我的数据框中排除

    【讨论】:

    • 嗨@will.cass.wrig,感谢您的快速回复。金额的总和应该是返回值。首先,我打算按用户分组。第二个操作将仅选择由 sub_group_ranges 给出的范围定义所涵盖的行,该范围定义仅适用于一个用户组。
    • 再说一次,我不确定我是否理解您对第二次手术的要求,但我相信我的解决方案中的最终表格回答了这个问题。然后,如果需要,您可以通过将 pandas 列添加在一起来将解决方案合并到一个列中。
    • 谢谢,你是对的。我不得不对其进行一些调整以完全满足我的要求,但效果很好。基本上使它适用于整个数据框,因此能够选择金额列。 def filter_time_range2(df_ele,trange):
      ` if (df_ele['time']>=trange[0]) and (df_ele['time']
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 2016-04-17
    • 2013-07-04
    • 2019-08-29
    • 2016-05-14
    • 2013-03-03
    • 2012-08-14
    • 2017-04-29
    相关资源
    最近更新 更多