【问题标题】:Apply a For loop in with a multiple GroupBy and nlargest在具有多个 GroupBy 和 nlargest 的情况下应用 For 循环
【发布时间】:2021-05-14 15:26:13
【问题描述】:

我正在尝试创建一个函数,该函数将遍历数据框中的 date_id 列,并为每 6 个连续值创建一个组,并对“value”列中的值求和,然后还返回每个组的最大值六个以及结果。

date_id     item_id value
0   1828    32      1180727.00
1   1828    43      944937.00
2   1828    40      806681.00
3   1828    42      721810.02
4   1828    36      567950.00
5   1828    45      545306.38
6   1828    26      480506.00
7   1828    53      375788.00
8   1828    37      236000.00
9   1828    38      234780.00
10  1828    21      208998.47
11  1828    41      135000.00
12  1797    39      63420.00
13  1828    28      24410.00
14  1462    52      0.00
15  1493    16      0.00
16  1493    17      0.00
17  1493    18      0.00
18  1493    15      0.00
19  1462    53      0.00
20  1462    47      0.00
21  1462    51      0.00
22  1462    50      0.00
23  1462    49      0.00
24  1462    45      0.00

每个 item_id 的期望输出是

    date_id                             item_id    value
0   max value from each date group      36         sum of all values in each date grouping

我尝试过使用 lambda

df_rslt = df.groupby('date_id')['value'].apply(lambda grp: grp.nlargest(6).sum())

但很快意识到这只会返回一个结果。

然后我在 for 循环中尝试了类似的方法,但没有成功

grp_data = df.groupby(['date_id','item_id']) 
               .aggregate({'value':np.sum})

df_rslt = grp_data.groupby('date_id')
             .apply(lambda x: x.nlargest(6,'value'))
             .reset_index(level=0, drop=True)

【问题讨论】:

    标签: python-3.x pandas numpy group-by


    【解决方案1】:

    从这里

    遍历数据框中的 date_id 列并为每 6 个连续值创建一个组

    我认为您需要先识别一个区块,然后在这些区块上加上groupby 以及日期:

    blocks = df.groupby('date_id').cumcount()//6
    df.groupby(['date_id', blocks], sort=False)['value'].agg(['sum','max'])
    

    输出:

                      sum        max
    date_id                         
    1828    0  4767411.40  1180727.0
            1  1671072.47   480506.0
    1797    0    63420.00    63420.0
    1828    2    24410.00    24410.0
    1462    0        0.00        0.0
    1493    0        0.00        0.0
    1462    1        0.00        0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多