как создать новый фрейм данных, объединив несколько столбцов существующего?

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть 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:

Вы можете агрегировать по столбцам с 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
  

Комментарии:

1. split является избыточным, если OP не имеет чисел с более чем 1 цифрой. Хороший ответ.

2. @Ch3steR — да, в примерах данных, но для общего решения я предпочитаю это.

3. @Ch3steR — да, согласен, трудно понять, считает ли OP, что числа должны начинаться с 10-

Ответ №2:

Вы можете использовать .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