Python pandas Проблема с повторением предыдущего значения

это мой код

import pandas as pd

columns1 = ['Student ID', 'Course ID', 'Marks']
data1 = [(1, 10, 100), (2, 400, 200), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300)]
df1 = pd.DataFrame(data1, columns=columns1)
Студенческий билет Идентификатор курса Метки 1 10 100 2 400 200 3 30 300 3 30 300 3 30 300 3 30 300 3 30 300 3 30 300
df1['s']  = np.where((df1['Course ID']  > df1['Marks'])  == True, df1['Student ID'],  df1['s'].shift(1)) 
df1
Студенческий билет Идентификатор курса Метки с 1 10 100 НЭН 2 400 200 2 3 30 300 2 3 30 300 НЭН 3 30 300 НЭН 3 30 300 НЭН 3 30 300 НЭН 3 30 300 НЭН

Как вы видете, изменилась только информация двух строк, а остальные пустые. Это результат, которого я ожидаю потому что после условия столбца 2 «df1['Идентификатор курса'] > df1['Оценки']» правда

Студенческий билет Идентификатор курса Метки с 1 10 100 НЭН 2 400 200 2 3 30 300 2 3 30 300 2 3 30 300 2 3 30 300 2 3 30 300 2 3 30 300 2

спасибо за помощь

Привет, добро пожаловать в ТАК. С помощью df1['s'].shift(1) вы сдвигаете столбец(ы), который еще не существует, поэтому второе изображение не может представлять собой результат выполнения именно этого кода. Вы получите сообщение об ошибке. Пожалуйста, обновите свой пост, указав ожидаемый результат (в виде текста, а не изображения) и объясните, какую логику вы пытаетесь реализовать.

ouroboros1 19.05.2024 12:21

Трудно понять, чего вы хотите, и ваш код не воспроизводит результат.

Panda Kim 19.05.2024 12:24

Похоже, вы хотите df1['s'] = df1['Student ID'].where(df1['Course ID'] > df1['Marks']).ffill(). Цепочка .astype('Int64'), если вам нужны целые числа, допускающие значение NULL.

ouroboros1 19.05.2024 12:43
Почему в 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
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы хотите присвоить идентификатор студента строкам, соответствующим условию df1['Course ID'] > df1['Marks'], а для других строк принять предыдущее значение, используйте ffill:

df1['s'] = (df1['Student ID']
            .where(df1['Course ID'] > df1['Marks'])
            .ffill()
            .convert_dtypes() # optional
           )

Вывод (с немного другим вводом):

   Student ID  Course ID  Marks     s
0           1         10    100  <NA>
1           2        400    200     2
2           3         30    300     2
3           3         30    300     2
4           3        400    300     3
5           3         30    300     3
6           3         30    300     3
7           3         30    300     3

Если вы хотите применить эту логику только к каждому идентификатору учащегося, что может иметь больше смысла, чтобы избежать «утечки» значений от одного учащегося к другому, лучше используйте groupby.ffill:

df1['s'] = (df1['Student ID']
            .where(df1['Course ID'] > df1['Marks'])
            .groupby(df1['Student ID']).ffill()
            .convert_dtypes() # optional
           )

Или:

df1['s'] = (df1['Student ID']
            .where(df1['Course ID'].gt(df1['Marks'])
                   .groupby(df1['Student ID']).cummax())
            .convert_dtypes() # optional
           )

Выход:

   Student ID  Course ID  Marks     s
0           1         10    100  <NA>
1           2        400    200     2
2           3         30    300  <NA>
3           3         30    300  <NA>
4           3        400    300     3
5           3         30    300     3
6           3         30    300     3
7           3         30    300     3

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