如何在熊猫数据框组中创建订单?

Posted

技术标签:

【中文标题】如何在熊猫数据框组中创建订单?【英文标题】:How to create order in pandas dataframe groups? 【发布时间】:2019-02-10 01:47:22 【问题描述】:

我有数据数据框,我想在其中添加列,该列将分别指示每个 user_id 的日期顺序,所以它就像在 TABLE2 中一样。

表 1:

user_id         received_at          action    
0043e1a6-52e4   2018-01-05 12:32:10  A                 
                2018-01-05 12:33:13  A                 
                2018-01-05 12:42:12  B                 
0070f782-29f4   2018-01-06 01:41:18  A                 
                2018-01-06 01:42:12  A                 
                2018-01-06 01:43:11  B                 
                2018-01-06 01:44:18  C                               
008aa58a-84a5   2018-01-06 14:22:13  A                 
                2018-01-06 14:23:18  A                 
                2018-01-06 14:24:13  A                 
                2018-01-06 14:25:18  C 

这样的事情

表 2:

user_id         received_at          action  order_n 
0043e1a6-52e4   2018-01-05 12:32:10  A       1               
                2018-01-05 12:33:13  A       2               
                2018-01-05 12:42:12  B       3               
0070f782-29f4   2018-01-06 01:41:18  A       1               
                2018-01-06 01:42:12  A       2               
                2018-01-06 01:43:11  B       3               
                2018-01-06 01:44:18  C       4                             
008aa58a-84a5   2018-01-06 14:22:13  A       1               
                2018-01-06 14:23:18  A       2               
                2018-01-06 14:24:13  A       3               
                2018-01-06 14:25:18  C       4  

有没有比分别对每个 user_id 进行迭代更有效、可能更简单的解决方案?

【问题讨论】:

我认为您的输出中有几次与输入 DataFrame 不匹配。 Pandas Number Rows Within Group的可能重复 df['order_n'] = df.groupby(level=0).cumcount()+1 我修复了输出示例。不幸的是,您提供的解决方案不起作用。 【参考方案1】:

groupby user_id 并使用received_at 获取rank

df['count_n'] = df.groupby('user_id').received_at.apply(pd.Series.rank)

这不需要排序步骤,即使数据框未按每个组内的received_at 排序,也会分配正确的排名

如果将user_id 列设置为索引(如您的示例数据似乎 所示),您可以替代使用以下内容。虽然,在最新版本的 pandas 中,按命名索引分组也有效(即上述方法可能有效)

df.groupby(level=0).received_at.apply(pd.Series.rank)

【讨论】:

谢谢,您的第一个解决方案适用于本示例。但是,在更大的样本中,如果一个“received_at”中有两个不同的“动作”,它会提供浮点“count_n”。添加标志解决了这个问题: df['count_n'] = df.groupby('user_id').received_at.apply(pd.Series.rank, method='first' ) @Somew,很高兴您能够解决问题

以上是关于如何在熊猫数据框组中创建订单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中创建滑动窗口并应用函数

如何在熊猫中创建与多列相结合的数据框列

当组值不是唯一标识时如何在熊猫中创建堆积条

如何从熊猫数据框中创建一个字典?

如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?

如何从熊猫的同一列中创建一个行值数组?