python pandas 重复前一个值时出现问题

问题描述 投票:0回答:1

是我的代码

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

谢谢您的帮助

python pandas dataframe numpy shift
1个回答
0
投票

如果您想为符合

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
© www.soinside.com 2019 - 2024. All rights reserved.