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

时间:2019-03-25 22:40:51

标签: python pandas etl pandas-groupby data-science

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

答案 0 :(得分:1)

使用-executionpolicy remotesignedgroupby来获取后缀,然后使用cumcount有条件地对其进行设置。

np.where

如果您对带有后缀的2和4感到满意,那么这是一个稍微简单的解决方案;您可以使用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 groupby生成后缀,然后使用cumcount加入后缀。

str.cat