У меня есть dataframe df, как показано:

1-1    1-2    1-3    2-1    2-2    3-1    3-2    4-1    5-1
10      3      9      1     3       9      33     10     11
21      31     3      22    21      13     11     7      13
33      22     61     31    35      34     8      10     16
6       9      32     5      4      8      9      6      8

Где объяснение столбцов следующее:

Первая цифра - это номер группы, а вторая - ее часть или подгруппа. В нашем примере у нас есть группы 1,2,3,4,5, а группа 1 состоит из 1-1,1-2,1-3.

Я хотел бы создать новый фрейм данных, в котором есть только группы 1,2,3,4,5 без подгрупп, и выбрать для каждой строки максимальное число в подгруппе и быть гибким для любых новых изменений или увеличения групп или подгрупп.

Мне нужен новый фрейм данных, как показано на рисунке:

1    2    3    4    5
10   3    33   10   11
31   22   13   7    13
61   35   34   10   16
32   5    9    6    8
1
moham 7 Окт 2020 в 13:50

2 ответа

Лучший ответ

Вы можете агрегировать по столбцам с помощью axis=1 и лямбда-функции для разделения и выбирать первые значения с помощью max и DataFrame.groupby:

Это работает правильно, если номера групп содержат 2 или более цифр.

df1 = df.groupby(lambda x: x.split('-')[0], axis=1).max()

Альтернативой являются имена разделенных столбцов:

df1 = df.groupby(df.columns.str.split('-').str[0], axis=1).max()

print (df1)
    1   2   3   4   5
0  10   3  33  10  11
1  31  22  13   7  13
2  61  35  34  10  16
3  32   5   9   6   8
2
jezrael 7 Окт 2020 в 11:05

Вы можете использовать .str[] или .str.get здесь.

df.groupby(df.columns.str[0], axis=1).max())

    1   2   3   4   5
0  10   3  33  10  11
1  31  22  13   7  13
2  61  35  34  10  16
3  32   5   9   6   8

0
Ch3steR 7 Окт 2020 в 10:58