【问题标题】:how to pandas groupby using two columns but merge groups for unique combinations of keys in those two columns如何使用两列进行熊猫分组,但合并组以获取这两列中键的唯一组合
【发布时间】:2020-10-07 13:06:44
【问题描述】:

我正在努力解决这个问题,而没有编写一些可怕的循环来检查 groupby 之后的组并将它们合并在一起。我觉得他们必须是一种我不知道的方式来做到这一点。

我想要做的是将数据框按其两列分组,但有时会出现键被翻转的那些组的组合(即 [key1, key2] 将有一个组和 [key2, key1 ] 将有一个组。我实际上想将这些组合中的组合并到一个组中。

事后可以循环执行。我也尝试过使用这样的一些方法:

unique combinations of values in selected columns in pandas data frame and count

但无法让它工作。

这是我的 df 示例:

            Ves-1 type          Ves-2 type    Duration
0                cargo                 tug  898.559993
1     fishing_trawling                 tug  898.559992
2   fishing_transiting                 tug  898.559993
3   fishing_transiting                 tug  898.559993
4                  tug                 tug  898.559992
5                cargo                 tug  898.560002
6                cargo                 tug  898.560002
7            passenger                 tug  907.200008
8             pleasure                 tug  898.560003
9                cargo                 tug  898.559993
10               cargo                 tug  898.559993
11               cargo  fishing_transiting  898.560002
12               cargo  fishing_transiting  898.559993
13               cargo  fishing_transiting  898.560002
14                 tug  fishing_transiting  898.560003
15               cargo  fishing_transiting  907.200008
16               cargo  fishing_transiting  907.200008
17                 tug  fishing_transiting  898.560002
18               cargo  fishing_transiting  898.560002
19  fishing_transiting  fishing_transiting  898.559993

如果我只是使用两个 Ves 列进行简单的分组:

>>> test.groupby(['Ves-1 type','Ves-2 type'])['Duration'].agg(list)
Ves-1 type          Ves-2 type
cargo               fishing_transiting    [898.560002, 898.5599930000001, 898.560002, 90...
                    tug                   [898.5599930000001, 898.560002, 898.560002, 89...
fishing_transiting  fishing_transiting                                  [898.5599930000001]
                    tug                              [898.5599930000001, 898.5599930000001]
fishing_trawling    tug                                                 [898.5599920000001]
passenger           tug                                                        [907.200008]
pleasure            tug                                                        [898.560003]
tug                 fishing_transiting                             [898.560003, 898.560002]
                    tug                                                 [898.5599920000001]

问题是现在我有一个 fishing_transiting/tug 组合和一个 tug/fishing_transiting 组合...有没有办法将这些组合并在一起?

编辑 - 我尝试了另一种解决方法,但想知道是否有办法在 groupby 中处理这个问题:

>>> test['key'] = list(zip(test['Ves-1 type'].values, test['Ves-2 type'].values))
>>> test['key'] = test['key'].apply(sorted).astype(str)
>>> test.groupby('key')['Duration'].agg(list)
key
['cargo', 'fishing_transiting']                 [898.560002, 898.5599930000001, 898.560002, 90...
['cargo', 'tug']                                [898.5599930000001, 898.560002, 898.560002, 89...
['fishing_transiting', 'fishing_transiting']                                  [898.5599930000001]
['fishing_transiting', 'tug']                   [898.5599930000001, 898.5599930000001, 898.560...
['fishing_trawling', 'tug']                                                   [898.5599920000001]
['passenger', 'tug']                                                                 [907.200008]
['pleasure', 'tug']                                                                  [898.560003]
['tug', 'tug']                                                                [898.5599920000001]

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们将Ves-1 type 和Ves-2 type 列中的值与axis=1 一起排序,然后groupby 这些排序列上的数据框和agg Duration 使用list:

    c = ['Ves-1 type', 'Ves-2 type']
    df.groupby(np.sort(df[c], axis=1).T.tolist())['Duration'].agg(list)
    

    cargo               fishing_transiting    [898.5600019999999, 898.559993, 898.5600019999...
                        tug                   [898.559993, 898.5600019999999, 898.5600019999...
    fishing_transiting  fishing_transiting                                         [898.559993]
                        tug                   [898.559993, 898.559993, 898.5600029999999, 89...
    fishing_trawling    tug                                                        [898.559992]
    passenger           tug                                                        [907.200008]
    pleasure            tug                                                 [898.5600029999999]
    tug                 tug                                                        [898.559992]
    Name: Duration, dtype: object
    

    【讨论】:

    • 这正是我所寻找的,类似于我丑陋的列表/zip 解决方案,但更干净!将在一分钟内接受
    • @DerekEden 编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多