为了账号安全,请及时绑定邮箱和手机立即绑定

根据组的长度拆分和更改熊猫“groupby”元素的值

根据组的长度拆分和更改熊猫“groupby”元素的值

桃花长相依 2021-12-16 16:11:15
我有一个名为'order_id'的列的 Pandas DataFrame 对象。具有相同 id 的行属于同一个顺序(大小可以是 1 到 1000 之间的任何值),例如:sales_orders = {    'order_id': [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4],    # multiple other fields }df = pd.DataFrame(sales_orders)我需要根据截止值将组分成更小的块,例如 3。理想情况下,除了列的后缀之外没有其他任何变化,即:'order_id': [1-0, 1-0, 1-0, 1-1, 1-1, 1-1, 1-2, 2, 2, 2, 3-0, 3-0, 3-0, 3-1, 3-1, 3-1, 3-2, 3-2, 3-2, 4]我假设人们可以简单地遍历组并在 for 循环中单独触摸每个组,如下所示:for order_id, group in df.groupby(by=['order_id']):    if group.shape[0] > 2:        # change column line by line但这看起来令人难以置信的非熊猫和可怕的缓慢。因此,我将不胜感激一个明智的、高性能的和可读的解决方案 ;) 在此先感谢您的帮助!
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

使用groupby和cumcount获取后缀,然后使用np.where有条件地设置它们。


c = df.groupby('order_id').cumcount() // 3

m = (c == 0).groupby(df.order_id).transform('all')


df['order_id2'] = (

    np.where(m, df.order_id, df.order_id.astype(str) + '-' + c.astype(str))

      .astype(str))


df.head(10)


   order_id order_id2

0         1       1-0

1         1       1-0

2         1       1-0

3         1       1-1

4         1       1-1

5         1       1-1

6         1       1-2

7         2         2

8         2         2

9         2         2

如果您对 2 和 4 也有后缀没问题,那么一个稍微简单的解决方案;您可以使用groupby和cumcount来生成后缀,然后使用str.cat来连接它们。


c = (df.groupby('order_id').cumcount() // 3).astype(str)

df['order_id3'] = df['order_id'].astype(str).str.cat(c, sep='-')


df.head(10)


   order_id order_id2 order_id3

0         1       1-0       1-0

1         1       1-0       1-0

2         1       1-0       1-0

3         1       1-1       1-1

4         1       1-1       1-1

5         1       1-1       1-1

6         1       1-2       1-2

7         2         2       2-0

8         2         2       2-0

9         2         2       2-0


查看完整回答
反对 回复 2021-12-16
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信