группа панды на заданном столбце и получение соответствующего максимального значения из другого столбца - PullRequest
1 голос
/ 08 апреля 2020

Мои данные следующие:

 set_name |  cases | label

0 {a,b,c}    7        'a b c'
1 {j,i,a}    2        'j i a'
2 {a,c}      1        'a c'
3 {b,c,a}    2        'b c a'

Я хотел бы сгруппировать по set_name с суммой по делам. но - мне нужно, чтобы метка соответствовала строке с максимальным количеством случаев. поэтому выходные данные будут выглядеть так:

 set_name |  cases | label

0 {a,b,c}    9        'a b c'
1 {j,i,a}    2        'j i a'
2 {a,c}      1        'a c'

Так как и {a, b, c}, и {b, c, a} равны (они установлены), я хочу их суммировать. я попытался использовать предложенное решение здесь , но так как groupby не может работать на множествах, я не могу продолжить его

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Becuase set s не подлежит отмене. Одним из возможных решений является использование frozenset s и агрегирование по GroupBy.agg:

df1 = (df.sort_values(by='cases', ascending=False)
         .groupby(df['set_name'].apply(frozenset))
         .agg({'set_name': 'first',
               'cases':'sum',
               'label':'first'})
         .reset_index(drop=True))
print (df1)
    set_name  cases  label
0  {a, c, b}      9  a b c
1  {i, j, a}      2  j i a
2     {a, c}      1    a c
1 голос
/ 08 апреля 2020
(
    df.sort_values(by='cases', ascending=False)
    .groupby(df.set_name.apply(sorted).apply(str))
    .agg(set_name=('set_name', 'first'),
         cases=('cases', 'sum'),
         lalbel=('label', 'first'),
        )
    .reset_index(drop=True)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...