【问题标题】:How to group a dataframe and summarize over subgroups of consecutive numbers in Python?如何在 Python 中对数据框进行分组并汇总连续数字的子组?
【发布时间】:2018-11-21 16:29:23
【问题描述】:

我有一个数据框,其中一列包含 ids,其他列包含数字:

df1 = {'ID':[400, 400, 400, 400, 400, 400, 500, 500, 500, 500], 
      'Number':[1, 2, 3, 4, 8, 9, 22, 23, 26, 27]}

您可能会注意到,每个 ID 在“编号”列中都有相应的一系列连续数字。例如:

Id 400 包含一系列长度为 4 {1, 2, 3, 4} 和另一个长度为 2 {8, 9}

我想为每个 ID 获取其对应系列的平均长度。 在这个例子中:

df2 = {'ID':[400, 500], 'avg_length':[3, 2]}

任何想法将不胜感激!

【问题讨论】:

    标签: python pandas pandas-groupby group-summaries


    【解决方案1】:

    这是一种方式,两次使用 groupby,

    df1['tmp'] = (df1.Number - df1.Number.shift() > 1).cumsum()
    
    df1.groupby(['ID', 'tmp']).Number.count().groupby(level = 0).mean().reset_index(name = 'avg_length')
    
    2.29 ms ± 75.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
        ID  avg_length
    0   400 3
    1   500 2
    

    选项 2:不使用 apply 两次,仍然使用之前创建的 tmp 列

    df1.groupby('ID').tmp.apply(lambda x: x.value_counts().mean()).reset_index(name = 'avg_length')
    
    2.25 ms ± 99.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

      【解决方案2】:

      groupby + cumsum + value_counts

      您可以将groupby 与自定义函数一起使用:

      df = pd.DataFrame({'ID':[400, 400, 400, 400, 400, 400, 500, 500, 500, 500], 
                         'Number':[1, 2, 3, 4, 8, 9, 22, 23, 26, 27]})
      
      def mean_count(x):
          return (x - x.shift()).ne(1).cumsum().value_counts().mean()
      
      res = df.groupby('ID')['Number'].apply(mean_count).reset_index()
      
      print(res)
      
          ID  Number
      0  400     3.0
      1  500     2.0
      

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 2021-04-29
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        相关资源
        最近更新 更多