это мой код
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)
df1['s'] = np.where((df1['Course ID'] > df1['Marks']) == True, df1['Student ID'], df1['s'].shift(1))
df1
Как вы видете, изменилась только информация двух строк, а остальные пустые. Это результат, которого я ожидаю потому что после условия столбца 2 «df1['Идентификатор курса'] > df1['Оценки']» правда
спасибо за помощь
Трудно понять, чего вы хотите, и ваш код не воспроизводит результат.
Похоже, вы хотите df1['s'] = df1['Student ID'].where(df1['Course ID'] > df1['Marks']).ffill(). Цепочка .astype('Int64'), если вам нужны целые числа, допускающие значение NULL.






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