计算同一列之间的差异,在python中由另一列分组的连续行

Posted

技术标签:

【中文标题】计算同一列之间的差异,在python中由另一列分组的连续行【英文标题】:Computing difference between same column, consecutive rows grouped by another column in python 【发布时间】:2020-07-19 06:58:09 【问题描述】:

我有一个包含 2 列的数据框:UserProductCombo、OrderDates。我为每个用户/产品组有多个订单日期(每组 1 到 5 个日期)。

我已按降序对数据进行排序,以获得每个组的最高订单日期。

我想计算每个组的订单日期之间的差异,并将它们放在我的数据框中的一个新列中(IN DAYS)。

(即 OrderDate1-OrderDate2, OrderDate1-OrderDate3, OrderDate1-OrderDate4, OrderDate1-OrderDate5) 如果不超过 2 个订单存在,我希望它移动到下一组。

样本数据:

>>> bf_recency
        UserProduct               OrderDates
0   12111211/123232  2020-03-12 17:19:16.103
1   12111211/123232  2020-03-12 18:10:45.974
2   12111211/123232  2020-03-11 17:19:16.103
3   12111211/123232  2020-03-10 18:10:45.974
4   12111211/123232  2020-03-10 18:10:45.974
5   165870101/73066  2020-03-12 19:49:15.752

预期输出:

        UserProduct               diff(in days)
0   12111211/123232               N/A
1   12111211/123232               0
2   12111211/123232               1
3   12111211/123232               2
4   12111211/123232               2
5   165870101/73066               N/A

到目前为止我有这个:

df_frequency =  df.groupby(["UserProduct"])['ORDER_DATE'].nlargest(5).reset_index(name ='OrderDates') 

df_frequency.sort_values(by=['OrderDates'],inplace=True, ascending=False)

df_freq = df_frequency.groupby(['UserProduct'])['OrderDates'].transform(lambda x: x.diff())  #STUCK HERE

【问题讨论】:

你好兰吉斯。请阅读how to make good reproducible pandas examples。 @Ranjith 请提供示例输入和预期输出。它有助于更​​好地解释问题。 @MayankPorwal 我已经编辑了帖子,你现在可以看一下吗? @PyCharmer 现在这就是你改进问题的方法!谢谢。 【参考方案1】:

你可以这样做:

In [500]: df                                                                                                                                                                                                
Out[500]: 
       UserProduct              OrderDates
0  12111211/123232 2020-03-12 17:19:16.103
1  12111211/123232 2020-03-12 18:10:45.974
2  12111211/123232 2020-03-11 17:19:16.103
3  12111211/123232 2020-03-10 18:10:45.974
4  12111211/123232 2020-03-10 18:10:45.974
5  165870101/73066 2020-03-12 19:49:15.752

In [575]: df['diff(in days)'] = 0
In [583]: grp = df.groupby('UserProduct')['OrderDates']
In [576]: for i, group in grp:  
     ...:     df["diff(in days)"][df.index.isin(group.index)] = group.sub(group.iloc[0])
     ...: 
In [581]: df['diff(in days)'] = df['diff(in days)'].dt.days.abs()                                                                                                                                           

In [582]: df                                                                                                                                                                                                
Out[582]: 
       UserProduct              OrderDates  diff(in days)
0  12111211/123232 2020-03-12 17:19:16.103              0
1  12111211/123232 2020-03-12 18:10:45.974              0
2  12111211/123232 2020-03-11 17:19:16.103              1
3  12111211/123232 2020-03-10 18:10:45.974              2
4  12111211/123232 2020-03-10 18:10:45.974              2
5  165870101/73066 2020-03-12 19:49:15.752              0

【讨论】:

嗨 Mayank,但这是计算后续日期之间的差异。我希望我的结果计算第一行减去列中该组的所有其他行(如我的问题所示)

以上是关于计算同一列之间的差异,在python中由另一列分组的连续行的主要内容,如果未能解决你的问题,请参考以下文章

根据由另一列分组的不同列的最大值获取值[重复]

由另一列分组的SQL求和列

sql:选择由另一列分组的两列值的计数并获得两个计数的比率

根据另一列计算两个标记之间的差异

如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?

在 Pandas 中基于一列保存数据并由另一列命名