记录分组算法

时间:2019-05-14 08:08:32

标签: python pandas algorithm

我的表格如下:

Group Name
1     A
1     B
2     R
2     F
3     B
3     C

我需要通过以下角色将这些记录分组: 如果一个组收到另一个组中包含的至少一个名称,则这两个组在同一个组中。在我的情况下,组1包含A和B。组3包含B和C。它们具有通用名称B,因此它们必须在同一组中。 结果,我想得到这样的东西:

Group Name ResultGroup
1     A    1
1     B    1
2     R    2
2     F    2
3     B    1
3     C    1

我已经找到了解决方案,但是在我的表中大约有20万条记录,因此需要太多时间(超过12小时)。有没有优化的方法?可能正在使用熊猫之类的东西?

def printList(l, head=""):
    if(head!=""):
        print(head)
    for i in l:
        print(i)

def find_group(groups, vals):
    for k in groups.keys():
        for v in vals:
            if v in groups[k]:
                return k
    return 0

task = [ [1, "AAA"], [1, "BBB"], [3, "CCC"], [4, "DDD"], [5, "JJJ"], [6, "AAA"], [6, "JJJ"], [6, "CCC"], [9, "OOO"], [10, "OOO"], [10, "DDD"], [11, "LLL"], [12, "KKK"] ]

ptrs = {}
groups = {}

group_id = 1

printList(task, "Initial table")

for i in range(0, len(task)):
    itask = task[i]
    resp = itask[1]
    val = [ x[0] for x in task if x[1] == resp ]
    minval = min(val)
    for v in val:
        if not v in ptrs.keys(): ptrs[v] = minval

    myGroup = find_group(groups, val)
    if(myGroup == 0):
        groups[group_id] = list(set(val))
        myGroup = group_id
        group_id += 1
    else:
        groups[myGroup].extend(val)
        groups[myGroup] = list(set(groups[myGroup]))

    itask.append(myGroup)
    task[i] = itask

print()
printList(task, "Result table")

1 个答案:

答案 0 :(得分:3)

您可以按“名称”分组并保留第一个分组:

df = pd.DataFrame({'Group': [1, 1, 2, 2, 3, 3], 'Name': ['A', 'B', 'R', 'F', 'B', 'C']})
df2 = df.groupby('Name').first().reset_index()

然后与原始数据帧合并并删除原始组的重复项:

df3 = df.merge(df2, on='Name', how='left')
df3 = df3[['Group_x', 'Group_y']].drop_duplicates('Group_x')
df3.columns = ['Group', 'ResultGroup']

再进行一次合并将为您提供结果:

df.merge(df3, on='Group', how='left')

Group Name  ResultGroup
    1    A            1
    1    B            1
    2    R            2
    2    F            2
    3    B            1
    3    C            1