• Как отсортировать значение по группам?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри скажу прямо задачка для общего кейса безнадежная надо менять вводные, потому что с одной стороны мы можем создать категории например ОГСЭ но затем у них еще и индексы 01, 02 и т.д., для того куска что ты дал я сделал, ну как общее решение это надо на уровне дизайна проблемы решать.
    cat = pd.Categorical(df['Шифр дисциплины'].str.split('.').str[0], 
    categories=['ОГСЭ','ЕН','ОПЦ','МДК','УП','ПМ','ПП'])
    print(df
     .groupby(cat)
     .apply(lambda x: x.sort_values('Шифр дисциплины', key = lambda x: x.str.split('.').str[1]))
     .reset_index(drop=True)
    )

    По решению, трюк следующий, создаем категории, они имеют порядок индекс. Когда, мы группируем groupby он СОРТИРУЕТ по умолчанию, и затем мы сортируем снова. То есть хитрость в том что бы впихнуть двойную сортировку, сначала по категориям а потом по цифрам внутри каждой категории.

    Кстати имей ввиду во второй своей попытке ты был на правильном направлении и задачка вполне себе типичная, только вместо твоего кода надо писать вот так
    cat = pd.Categorical(df['Шифр дисциплины'].str.split('.').str[0], 
    categories=['ОГСЭ','ЕН','ОПЦ','МДК','УП','ПМ','ПП'])
    df.sort_values(by=['Шифр дисциплины'],key= lambda x: cat)
    Результат будет, как у тебя только кода меньше и без всяких созданий временных колонок.

    Но повторюсь, для общего кейса на уровне дизайна надо работать, такие сложные парсинги внутри колонок это плохо. Pandas он конечно может все (что помещается в память) но лучше для полезных задач его использовать.
    Ответ написан
    2 комментария
  • Как можно сверстать градиентный бордер на градиентном фоне?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Всё возможно.
    Например, так



    Поддержка в целом неплохая https://caniuse.com/css-masks
    Но если надо более надежно, то css-маску можно поменять на svg-маску
    Ответ написан
    3 комментария
  • Почему данные записываются не корректно в MySQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    2147483647 = 231 - 1
    Это максимальное 32-битное целое число со знаком.
    Если вам нужно что-то большее, то используйте не число, а строку.
    Ответ написан
    1 комментарий
  • Как оформить программный код (С++) в Microsoft Word?

    ntkt
    @ntkt
    Потомственный рыцарь клавиатуры и паяльника
    Я всегда вставляю preformatted текст в таблицу.
    Таблица состоит из одной большой ячейки, если вставляется самодостаточный кусок кода или фрагмент лога, и из нескольких — если нужны заголовки или комментарии.
    А по поводу подсветки синтаксиса в копируемом коде коллеги выше уже всё сказали.
    Ответ написан
    Комментировать
  • Как найти числа в списке после символа «:» с помощью регулярного выражения?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    import re
    
    data = """
    1 ) София Захарова : 322 221 929 монет
    2 ) Диана Зайцева : 123 543 монеты
    3 ) Семен Соколов : 199 монет
    4 ) Вадим Новиков : 18 монет
    5 ) Игорь Валеев : 5 монет
    """
    
    # Регулярное выражение для поиска чисел после ":"
    pattern = r":\s*([\d\s]+)"
    
    # Поиск всех совпадений
    matches = re.findall(pattern, data)
    
    # Преобразование результатов в список чисел
    numbers = [int(match.replace(" ", "")) for match in matches]
    
    print(numbers)
    Ответ написан
    1 комментарий
  • Как заменить загружаемое изображение Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Раз. Если не хватит, то два.
    Ответ написан
    1 комментарий
  • Почему не работает text-decoration: none в nav, а в самих ссылках работает?

    Nolis
    @Nolis
    it-гопник
    Потому что только у a имеется это свойство. чтобы все руками не прописывать по отдельности можно указать так:
    .nav a {
     text-decoration: none;
    }
    Ответ написан
    Комментировать
  • Требуется код ревью. Как правильно составить логику меню?

    @spaceatmoon
    Из очевидного на мой взгляд:
    1. Нет валидации, а лучше вообще не давать заполнять произвольными данными. Лучше заменить на словарь где в консоли вместо "Введите должность" будет "Выберете из предложенных вариантов" и напротив каждой должности своё число.
    public void SetNewPos()
            {
                Console.Write($"Введите должность для {Fullname}\nТекущая: {Position}\nНовая: ");
                this.Position = Console.ReadLine();
            }

    2. Тоже самое для статусов пункт 1.
    3. Вместо простых типов используй объекты для валидации
    private BirthdateFormat Birthdate { get; set; }   //Дата рождения
            private FullnameRules Fullname { get; set; }    //ФИО
            private Department DepartmentCode  { get; set; }  //Отдел
            private CompanyPosition Position { get; set; }    // Должность
            private int Salary { get; set; }         //Зарплата
            private int Expirience { get; set; }     //Стаж
            private StatusDict Status { get; set; }      //Состояние

    Вместо отдельных классов типа StatusDict можно их сделать enum, но тут всё равно нужна валидация
    public class A {
    		
    		public StatusDict StatusCode {get; set;}
    	
    		public enum StatusDict
    		{
    			Open = 1,
    			Close
    		}
    		
    		public A(int code)
    		{
    			StatusCode = (StatusDict)code;
    		}
    	}

    4. Не делай так. Это бессмысленная операция. При объявленных типах там и так будет 0, "", false в зависимости от типа. Да и вообще эта перегрузка создаёт дыру в системе, где неопределённый сотрудник с такими значениями плавает в базе.
    public Employee()
            {
                this.Fullname = "0";
                this.Department = "0";
                this.Salary = 0;
                this.Expirience = 0;
                this.Position = "0";
                this.Birthdate = "0";
            }

    5. Очень плохо.
    //Бесконечный цикл для работы меню
                for (; ; )

    Не сильно знаком с C#, возможно куратор подскажет. Я бы заменил на goto и дело с концом;
    Repeat:
                var key = Console.ReadKey();
                if (key.KeyChar == '1' || key.KeyChar == '3')
                {
                    return;
                }
                else
                {
                    goto Repeat;
                }

    7. Много шаблонного кода.
    8. Нет проверок на выход за пределы границ массивов
    9. При вводе такой строки 1,2,бобёр валится ошибка. Нет валидации.
    Convert.ToInt32(Console.ReadLine());
    10. Зачем в коде очевидные комментарии? Комментировать нужно сложные вещи.
    Попробовал облегчить твоё меню. Могу отметить, что зная меню, можно спуститься сразу на нужный этаж.
    Repeat:
                Console.Clear();     //Очищает консоль после отработки функции
                string input;
                string currentLevel;
                Console.WriteLine("Выберите функцию");
                Console.WriteLine("1 Получить информацию");
                Console.WriteLine("2 Изменить должность");
                Console.WriteLine("3 Измеить отдел");
                Console.WriteLine("4 Изменить стаж");
                Console.WriteLine("5 Изменить зарплату");
                Console.WriteLine("6 Изменить статус");
                Console.WriteLine("0 Выход");
                //Двух уровневое меню реализованное c помощью линейного switch
                currentLevel = "";
                Command:
                //input = Console.ReadLine();
                currentLevel += Console.ReadLine();
                Console.WriteLine(currentLevel);
                switch (currentLevel)
                {
                    case "1":
                        Console.WriteLine("Выберите количество \n1 Все \n2 Один \n3 Несколько");
                        goto Command;
                    case "11":
                        for (int i = 0; i < Employers.Length; i++)
                        {
                            Employers[i].PrintInfo();
                            Console.WriteLine("___________________________");
                        }
                        Console.ReadKey();  //Костыль который не позволяет моментально очистить вывод
                        break;
                    case "12":
                        int c12input;
                        for (int i = 0; i < Employers.Length; i++)
                        {
                            Console.Write(i + 1 + " ");
                            Employers[i].PrintName();
                        }
                        Console.WriteLine("Выберите сотрудника");
                        c12input = Convert.ToInt32(Console.ReadLine());
                        Employers[c12input - 1].PrintInfo();
                        Console.WriteLine("___________________________");
                        break;
                    case "13":
                        Console.WriteLine("Выберите сотрудника");
                        Console.WriteLine("0 для возврата в предыдущее меню\n-------");
                        for (int i = 0; i < Employers.Length; i++)
                        {
                            Console.Write(i + 1 + " ");
                            Employers[i].PrintName();
                        }
                        Console.WriteLine("___________________________");
                        int c13input;
                        while ((c13input = Convert.ToInt32(Console.ReadLine())) != 0) //пока не введен 0, можно вводить индексы сотрудников
                        {
                                Employers[c13input - 1].PrintInfo();
                                Console.WriteLine("___________________________");
                        }
                        break;
               }
              goto Repeat;
    Ответ написан
    2 комментария