如何创建一个行号,从另一列推断它所属的组?想在pandas和postgresql/sql中做这件事

ruarlubt  于 2023-06-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(169)

更新:下面提供了SQL解决方案,但尚未提供pandas解决方案。如果有人有pandas解决方案,我很感激。
我有一个table/pandas dataframe,看起来像这样:

在每个用户的第一行总是由“新”指示的新组的情况下,则下一行可以在同一组(由“相同”指示)或新组(由“新”指示)中。
我想添加一个列group_number,它将为与其组相关的每一行创建一个数字,使得用户的第一组的所有行都是1,用户的第二组的所有行都是2,等等。在我的例子中,它看起来像这样:

我可以像下面的代码一样在pandas中迭代行,但是如果有一个矢量化的解决方案就更好了。:

group_number=[]
current_user=-1

for index, row in myDF.iterrows():    
    if row['user']!=current_user:
        group_number.append(1)
        counter=1
        current_user=row['user']
    elif row['group']=='same' :
        group_number.append(counter)
    else:
        counter+=1
        group_number.append(counter)

myDF['group_number']=group_number

(Side注意可能相关或不相关:我认为这个问题有一些味道的差距和岛屿结构/问题,但它是一个有点不同(我相信它是一个有点更一般)
如何在postgresql/sql和pandas(一个矢量化的解决方案)中创建group_number?

2admgd59

2admgd591#

在Postgres SQL中,我们可以只计算每个用户的“新”行的窗口计数。假设你有一个列来排序你的记录,比如id

select t.*,
    count(*) filter(where grp = 'new') over(partition by usr order by id) rn
from mytable t
order by usr, id

我将表列重命名为mytable(usr, grp)(因为usergroup是SQL关键字)。新的组号出现在第三列rn中。

相关问题