#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-