这是我当前 Dataframe (df 1)的一个简化示例,在将嵌套循环计算的结果合并回客户数据之后。我的实际 Dataframe 是1000万行以上,所以我处理的是大数据,我更喜欢最快的方法。
df1 = pd.DataFrame({"id": ['z111','z111','z111','z111','z112','z112','z112','z112'], #customer data
"calc_amt": [1000,500,200,300,100,50,30,200],
"month_end":['28-02-2023','28-02-2023','28-02-2023','28-02-2023','28-02-2023','28-02-2023','28-02-2023','28-02-2023'],
"period":[2,2,2,2,6,6,6,6],})
我试图找到最有效的方法来完成以下工作;按每个用户id,id喜欢,
在列名period中每隔3行递增1在列名month_end中每隔3行递增1(到下一个month_end日期)添加一个计算编号列以标记计算(calc_num)。
我的预期输出(df 2)
df2 = pd.DataFrame({"id": ['z111','z111','z111','z111','z112','z112','z112','z112'], #customer data
"calc_amt": [1000,500,200,300,100,50,30,200],
"month_end":['28-02-2023','28-02-2023','31-03-2023','31-03-2023','28-02-2023','28-02-2023','31-03-2023','31-03-2023'],
"period":[2,2,3,3,6,6,7,7],
"calc_num":[1,2,1,2,1,2,1,2],})
2条答案
按热度按时间zbq4xfa01#
您可以使用
groupby.cumcount
来枚举每组的行,然后使用modulo或floor除法:df2 = df1.copy()
,然后使用df2
。*输出:
q3qa4bjr2#
使用
GroupBy.cumcount
作为计数器,整数和模除以2
,最后加上下个月,并通过Serie.dt.to_period
转换为月周期:或者对
offsets.MonthEnd
使用lsit理解:由于使用的是大型DataFrame,因此下面是有效添加月份的技巧-技巧是将整数除以
2
,然后减去一天,再添加下一个月: