我是分组旅行者谁一起旅行,根据百分比的旅行,他们一起。这似乎类似于另一个问题(Group Python list of lists into groups based on overlapping items),但条件不同。
只有在80%的旅行者和一起旅行的情况下,他们才会被聚在一起。如果同一个旅行者是在不同的群体中,那是可以的。
数据:(实际数据集很大,超过1000次旅行和旅行者)
Traveller Trips
A [Trip_1, Trip_2, Trip_3, Trip_4, Trip_5]
B [Trip_1, Trip_2, Trip_3, Trip_4]
C [Trip_6, Trip_7]
D [Trip_8]
E [Trip_2, Trip_3, Trip_4, Trip_5]
F [Trip_2, Trip_3, Trip_4, Trip_5]
G [Trip_8]
预期产出:
TravelGroup Traveller
Group_1 A
Group_1 B
Group_2 A
Group_2 E
Group_2 F
Group_3 C
Group_4 D
Group_4 G
注意A和B在一个组中,A、E和F在一个组中。然而,B和C并不属于组,因为他们在旅行中只有75%的匹配。
非常感谢您的帮助,非常感谢!
发布于 2020-05-21 09:41:44
df = pd.DataFrame({'Traveller':[*'ABCDE'], 'Trips': [
['Trip_1', 'Trip_2', 'Trip_3', 'Trip_4', 'Trip_5'],
['Trip_1', 'Trip_2', 'Trip_3', 'Trip_4'],
['Trip_1', 'Trip_2'],
['Trip_1'],
['Trip_2', 'Trip_3', 'Trip_4', 'Trip_5']
] })
from itertools import combinations
all_trips = df.explode('Trips')['Trips'].nunique()
all_travelers = set(df.Traveller)
groups, cnt = {'TravelGroup':[], 'Traveller':[]}, 1
for t1, t2 in combinations(df.Traveller, 2):
s1 = df.loc[df.Traveller==t1, 'Trips'].iloc[0]
s2 = df.loc[df.Traveller==t2, 'Trips'].iloc[0]
if len(set(s1).intersection(s2)) / all_trips >= 0.8:
group_name = 'Group_{}'.format(cnt)
groups['TravelGroup'].extend([group_name, group_name])
groups['Traveller'].extend([t1, t2])
cnt += 1
df = pd.DataFrame(groups)
for t in all_travelers.difference(df.Traveller):
group_name = 'Group_{}'.format(cnt)
df.loc[df.shape[0]] = [group_name, t]
cnt += 1
print(df)
指纹:
TravelGroup Traveller
0 Group_1 A
1 Group_1 B
2 Group_2 A
3 Group_2 E
4 Group_3 D
5 Group_4 C
https://stackoverflow.com/questions/61930700
复制相似问题