是我的代码
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
学生证 | 课程编号 | 标记 | s |
---|---|---|---|
1 | 10 | 100 | NaN |
2 | 400 | 200 | 2 |
3 | 30 | 300 | 2 |
3 | 30 | 300 | NaN |
3 | 30 | 300 | NaN |
3 | 30 | 300 | NaN |
3 | 30 | 300 | NaN |
3 | 30 | 300 | NaN |
如你所见, 仅两行信息发生变化,其余均为空。 这是我期望的结果 因为在第 2 列条件“df1['课程 ID'] > df1['Marks']”之后 是真的
学生证 | 课程编号 | 标记 | s |
---|---|---|---|
1 | 10 | 100 | NaN |
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['Course ID'] > df1['Marks']
条件的行分配学生 ID,而其他行则采用之前的值,请使用:
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
如果您只想对每个学生 ID 应用此逻辑,这可能更有意义,以避免一个学生将值“泄露”给另一个学生:
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