【问题标题】:Group based on same items in list in dataframe (python)基于数据框中列表中的相同项目进行分组(python)
【发布时间】:2020-05-21 08:51:26
【问题描述】:

我根据他们一起旅行的百分比对一起旅行的旅行者进行分组。这似乎与另一个问题 (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% 的匹配。

非常感谢这里的任何帮助,非常感谢!

【问题讨论】:

    标签: python list dataframe


    【解决方案1】:
    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
    

    【讨论】:

    • 非常感谢。但是,我很抱歉没有包括更多的分组可能性。我已经更新了上面的数据——A、E、F 必须在同一个组中,因为它们都满足 80% 的规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2021-09-29
    • 2015-02-23
    • 2012-11-13
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多