如何在数据框中进行后退/前进数据分组?

时间:2019-03-22 14:09:45

标签: python pandas group-by sum pandas-groupby

在实际数据集中有不同类型的组级别可用,我们将需要不同类型的逐组报告。 (注意:明智的报告并不简单,因此请仔细阅读以下示例)

需求示例

当我们需要报告第4级组报告时,则需要对数据字段求和,直到第4级之前的最后一个值。报告编号可以是“组”列中给出的任何编号。 (请参阅“期望的输出以获取更多清晰度”

对于其余部分,请进行以下处理:

购买日期,信息1和信息2 :在组级别提供提取日期

数据:总和

实际数据库:

Group   purchase_date   Info1   Info2   data
2       03/23/2019      A       B       57
3       03/24/2019      A       B       48
4       03/25/2019      A       B       40
1       03/26/2019      Q       B       60
2       03/27/2019      Q       B       42
3       03/28/2019      Q       B       33
4       03/29/2019      Q       B       36
1       03/30/2019      R       B       54
2       03/31/2019      R       B       57
3       04/01/2019      R       B       53
4       04/02/2019      R       B       56
1       04/03/2019      A       B       48
2       04/04/2019      A       B       40
3       04/05/2019      A       B       45
4       04/06/2019      A       B       60
1       04/07/2019      A       B       38
2       04/08/2019      A       B       58

按照上述要求对数据进行分组后的预期输出:

4th group level report:             
Group   purchase_date   Info1   Info2   data
4       03/25/2019      A       B       145
4       03/29/2019      Q       B       171
4       04/02/2019      R       B       220
4       04/06/2019      A       B       193
4       04/08/2019      A       B       96

2nd group level Report
Group   purchase_date   Info1   Info2   data
2       03/23/2019      A       B       57
2       03/27/2019      Q       B       190
2       03/31/2019      R       B       180
2       04/04/2019      A       B       197
2       04/08/2019      A       B       201

我已经按功能对它进行了尝试,但无法启动。

有人可以帮助我获得所需的输出吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

使用以下功能fileB.txt,其中参数f(z, l)是必需的级别,而l是您的DataFrame:

z

输出:

def f(z, l):
    x = (z['Group'] == l) | (z.index == z.index[-1])
    cs = z['data'].cumsum()
    dx = cs - cs.where(x, np.nan).ffill().shift(1).fillna(0)
    return z[x].drop('data', 1).assign(Group=l).join(dx)

print(f(df, 2))
print(f(df, 4))

基本上,每次我们击中具有给定级别的记录或DataFrame中的最后一条记录时, Group purchase_date Info1 Info2 data 0 2 03/23/2019 A B 57.0 4 2 03/27/2019 Q B 190.0 8 2 03/31/2019 R B 180.0 12 2 04/04/2019 A B 197.0 16 2 04/08/2019 A B 201.0 Group purchase_date Info1 Info2 data 2 4 03/25/2019 A B 145.0 6 4 03/29/2019 Q B 171.0 10 4 04/02/2019 R B 220.0 14 4 04/06/2019 A B 193.0 16 4 04/08/2019 A B 96.0 都会重置累积和。

更新:使cumsum中的最后一行始终等于前一行+ 4天:

purchase_date