Python 如何在数据帧中进行向后/向前数据分组?
实际数据集中有不同类型的组级别可用,我们需要不同类型的组级别报告。(注意:分组报告并不简单,因此请仔细阅读下面的示例) 需求示例 当我们需要报告第四级组报告时,则需要对数据字段求和,直到第四级前的最后一个值。报告编号可以是“组”列中给定的任何编号(请参考预期输出以了解更多信息) 对于其余的文件,处理如下: 购买日期、信息1和信息2:可在集团层面获取提货日期 数据:总和 实际数据库:Python 如何在数据帧中进行向后/向前数据分组?,python,pandas,group-by,sum,pandas-groupby,Python,Pandas,Group By,Sum,Pandas Groupby,实际数据集中有不同类型的组级别可用,我们需要不同类型的组级别报告。(注意:分组报告并不简单,因此请仔细阅读下面的示例) 需求示例 当我们需要报告第四级组报告时,则需要对数据字段求和,直到第四级前的最后一个值。报告编号可以是“组”列中给定的任何编号(请参考预期输出以了解更多信息) 对于其余的文件,处理如下: 购买日期、信息1和信息2:可在集团层面获取提货日期 数据:总和 实际数据库: Group purchase_date Info1 Info2 data 2 03/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
我已经尝试过按功能分组,但我无法启动它
有人能帮我得到想要的输出吗
提前感谢。使用以下功能
f(z,l)
,参数l
为所需级别,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))
输出:
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
计算累积总和,每次我们在数据帧中以给定的级别或最后一条记录命中一条记录时重置它们
更新:要使purchase\u date
中的最后一行始终等于前一行+4天:
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)
zz = z[x].drop('data', 1).assign(Group=l).join(dx)
zz['purchase_date'] = pd.to_datetime(zz['purchase_date'])
zz.at[zz.index[-1], 'purchase_date'] = zz.at[zz.index[-2], 'purchase_date'] + pd.Timedelta('4d')
return zz
问题的每一部分都只是指问题的另一部分。如果我不拼凑dfsOk之间的变化,这一点就不清楚了。我仔细阅读了它:-)和您尝试了什么?@roganjosh,但所有部分都重定向了towared预期输出,这里我给出了“Group”列中不同数据值的反向分组示例。@Wen Ben,我尝试了“Pandas Group by”但它只允许我对答案进行简单的汇总。是否可以在最后一行“购买日期”中保持间隙?“购买日期”列中有4天的间隔,我在最后一行中也需要。它总是紧靠最后一个值+4天,还是需要以某种方式动态推导?我认为这不起作用,因为您使用的是索引[-2],因此它将引用df的第二个最后一行,但我们尚未重置索引,还有其他解决办法吗?当然,你是对的。我认为最简单的方法是将我们要返回的结果保存为一个新的数据帧
zz
,然后进行调整。请参阅我答案的更新部分