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

卢卡斯NP Egger

我有一个名为'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

但是,这看起来令人难以置信,而且速度慢得令人难以置信。因此,我将感谢一个明智,高效且可读的解决方案;)预先感谢您的帮助!

cs95

使用groupbycumcount获取后缀,然后使用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的情况感到满意,则这是一个稍微简单的解决方案;您可以使用groupbycumcount生成后缀,然后使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章