Объединить строки столбца с предыдущими строками на основе условия

У меня есть этот CSV-файл (часть очень большого файла)

Курс/Секция Кредиты Название курса Время Здание Инструктор Дата экзамена Язык курса ACCT1112/10 3 Вводный финансовый ПН СМТ/E07 ххххххх 05.08.2022 Английский Бухгалтерский учет 08:00-09:50 СОЛНЦЕ 08:00-11:00 Е15 ACCT1112/11 3 Вводный финансовый ОБВЕНЧАЛИСЬ СМТ/E07 ххххххх Английский Бухгалтерский учет 08:00-09:50 ACCT1112/20 3 Вводный финансовый ПН СМТ/E05 ххххххх 05.08.2022 Английский Бухгалтерский учет 10:00-11:50 СОЛНЦЕ 08:00-11:00 Е16 ACCT1112/21 3 Вводный финансовый ОБВЕНЧАЛИСЬ СМТ/E05 ххххххх Английский Бухгалтерский учет 10:00-11:50 ACCT1112/30 3 Вводный финансовый ПН СМТ/E06 ххххххх 05.08.2022 Английский Бухгалтерский учет 12:00-13:50 СОЛНЦЕ 08:00-11:00 Е17 ACCT1112/31 3 Вводный финансовый ОБВЕНЧАЛИСЬ СМТ/E06 ххххххх Английский Бухгалтерский учет 12:00-13:50 ACCT1112/40 3 Вводный финансовый ПН СМТ/E23 ххххххх 05.08.2022 Английский Бухгалтерский учет 14:15-16:05 СОЛНЦЕ 08:00-11:00 Е18 ACCT1112/41 3 Вводный финансовый ОБВЕНЧАЛИСЬ СМТ/E23 ххххххх Английский Бухгалтерский учет 14:15-16:05 ACCT1112/50 3 Вводный финансовый СОЛНЦЕ СМТ/E27 ххххххх 05.08.2022 Английский Бухгалтерский учет 10:00-11:50 СОЛНЦЕ 08:00-11:00 Е19 ACCT1112/51 3 Вводный финансовый ЧТ СМТ/E27 ххххххх Английский Бухгалтерский учет 10:00-11:50 ACCT1112/60 3 Вводный финансовый ВТ СМТ/Е16 ххххххх-1 05.08.2022 Английский Бухгалтерский учет 10:00-11:50 ххххххх-2 СОЛНЦЕ 08:00-11:00 Е20 ACCT1112/61 3 Вводный финансовый ЧТ СМТ/Е16 мммммм-1 Английский Бухгалтерский учет 08:00-09:50 мммммм-2

Я хочу преобразовать его в

Курс/Раздел Кредиты Название курса Время Здание Инструктор Дата экзамена Язык курса ACCT1112/10 3 Вводный финансовый учет ПН 08:00-09:50 СМТ/E07 ххххххх 05.08.2022 ВС 08:00-11:00 E15 Английский ACCT1112/11 3 Вводный финансовый учет СР 08:00-09:50 СМТ/E07 ххххххх Английский ACCT1112/20 3 Вводный финансовый учет ПН 10:00-11:50 СМТ/E05 ххххххх 05.08.2022 ВС 08:00-11:00 E16 Английский ACCT1112/21 3 Вводный финансовый учет СР 10:00-11:50 СМТ/E05 ххххххх Английский ACCT1112/30 3 Вводный финансовый учет ПН 12:00-13:50 СМТ/E06 ххххххх 05.08.2022 ВС 08:00-11:00 E17 Английский ACCT1112/31 3 Вводный финансовый учет СР 12:00-13:50 СМТ/E06 ххххххх Английский ACCT1112/40 3 Вводный финансовый учет ПН 14:15-16:05 СМТ/E23 ххххххх 05.08.2022 ВС 08:00-11:00 E18 Английский ACCT1112/41 3 Вводный финансовый учет СР 14:15-16:05 СМТ/E23 ххххххх Английский ACCT1112/50 3 Вводный финансовый учет ВС 10:00-11:50 СМТ/E27 ххххххх 05.08.2022 ВС 08:00-11:00 E19 Английский ACCT1112/51 3 Вводный финансовый учет ЧТ 10:00-11:50 СМТ/E27 ххххххх Английский ACCT1112/60 3 Вводный финансовый учет ВТ 10:00-11:50 СМТ/Е16 ххххххх-1 ххххххх-2 05.08.2022 ВС 08:00-11:00 E20 Английский ACCT1112/61 3 Вводный финансовый учет ЧТ 08:00-09:50 СМТ/Е16 мммммм-1 мммммм-2 Английский

Я пытался

for i in range(len(df) - 1, 0, -1):
    if pd.isna(df.loc[i, 'Course/Section']):
        for col in df.columns:
            if pd.notna(df.loc[i, col]):
                df.loc[i - 1, col] = f"{df.loc[i - 1, col]} {df.loc[i, col]}" if pd.notna(df.loc[i - 1, col]) else df.loc[i, col]


df = df.dropna(subset=['Course/Section']).reset_index(drop=True)

Но мой код, похоже, не работает должным образом.

Итак, я хочу объединить значения строки с предыдущими, одно за другим снизу вверх, пока столбец Course/Section пуст, пока я не доберусь до строки, где Course/Section не пусто.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте группы на основе существующих значений в столбце 'Course/Section' с помощью cumsum, затем groupby и агрегируйте объединения значений в каждой группе:

g = df["Course/Section"].notna().cumsum()
df = (
    df.fillna("")
    .groupby(g, as_index=False)
    .agg(lambda x: " ".join(x.astype(str)).strip())
)
   Course/Section Credits                        Course Name             Time Building           Instructor                     Exam Date Course Language
0     ACCT1112/10     3.0  Introductory Financial Accounting  MON 08:00-09:50  CMT/E07              xxxxxxx  8/5/2022 SUN 08:00-11:00 E15         English
1     ACCT1112/11     3.0  Introductory Financial Accounting  WED 08:00-09:50  CMT/E07              xxxxxxx                                       English
2     ACCT1112/20     3.0  Introductory Financial Accounting  MON 10:00-11:50  CMT/E05              xxxxxxx  8/5/2022 SUN 08:00-11:00 E16         English
3     ACCT1112/21     3.0  Introductory Financial Accounting  WED 10:00-11:50  CMT/E05              xxxxxxx                                       English
4     ACCT1112/30     3.0  Introductory Financial Accounting  MON 12:00-13:50  CMT/E06              xxxxxxx  8/5/2022 SUN 08:00-11:00 E17         English
5     ACCT1112/31     3.0  Introductory Financial Accounting  WED 12:00-13:50  CMT/E06              xxxxxxx                                       English
6     ACCT1112/40     3.0  Introductory Financial Accounting  MON 14:15-16:05  CMT/E23              xxxxxxx  8/5/2022 SUN 08:00-11:00 E18         English
7     ACCT1112/41     3.0  Introductory Financial Accounting  WED 14:15-16:05  CMT/E23              xxxxxxx                                       English
8     ACCT1112/50     3.0  Introductory Financial Accounting  SUN 10:00-11:50  CMT/E27              xxxxxxx  8/5/2022 SUN 08:00-11:00 E19         English
9     ACCT1112/51     3.0  Introductory Financial Accounting  THU 10:00-11:50  CMT/E27              xxxxxxx                                       English
10    ACCT1112/60     3.0  Introductory Financial Accounting  TUE 10:00-11:50  CMT/E16  xxxxxxx-1 xxxxxxx-2  8/5/2022 SUN 08:00-11:00 E20         English
11    ACCT1112/61     3.0  Introductory Financial Accounting  THU 08:00-09:50  CMT/E16      mmmmm-1 mmmmm-2                                       English

Другие вопросы по теме