gpt4 book ai didi

python - 记录分组算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:08 24 4
gpt4 key购买 nike

我的表看起来像:

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 小时)。有没有办法优化它?可能正在使用 pandas 或类似的东西?

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")

最佳答案

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

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

关于python - 记录分组算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56125739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com