我可以使用 np.where 根据前一行实时更新值吗?

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

有什么方法可以实现像数据帧上那样的实时运行功能吗?

我有一个虚构的数据框“课堂”,如下 - 一个虚构的实现来说明问题 -:

学生。 主题。 马克。 新子。
迈克 英语 通过 英语
迈克 法语 通过
迈克 历史 通过
迈克 生物 失败
... ...... ......

**我想在“新子”列中实现值,这样对于每个学生,它都会检查所有科目的成绩,如果科目是“通过”,那么它将被附加到“新子”的当前列表中。它没有被添加,如果它是“失败”那么主题不应该被添加,以具有当前视图: **

学生。 主题。 马克。 新子。
迈克 英语 通过 英语
迈克 法语 通过 英语、法语
迈克 历史 通过 英语、法语、历史
迈克 生物 失败 英语、法语、历史
... ...... ......

我尝试使用 (np.where) 来实现它:

Classroom["新子."]= np.where((Classroom["马克."]=="通过"),Classroom["新子."].shift(1)+","+["主题"],教室["新子。"])

问题在于“新子”。运行 np.where 时,列不会在运行时更新,所以我得到的是以下内容:

学生。 主题。 马克。 新子。
迈克 英语 通过 英语
迈克 法语 通过 英语、法语
迈克 历史 通过 无,历史
迈克 生物 失败
... ...... ......

就好像它获取了“New Sub”的旧值。并且修改后没有得到以前的值。

有什么方法可以实现像数据帧上那样的实时运行功能吗?

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

使用“np.where”的方法的问题在于,它不是设计用来执行连接字符串和直接访问 pandas DataFrame 列中的先前值等操作的。您尝试使用 shift(1) 并访问“np.where”内的主题列,这将无法按预期工作。

您可以在 pandas 中组合使用 groupby、cumsum 和 apply 函数。

import pandas as pd
# Example DataFrame
data = {
'Student': ['Mike', 'Mike', 'Mike', 'Mike'],
'Subject': ['English', 'French', 'History', 'Bio'],
'Mark': ['pass', 'pass', 'pass', 'fail']}
df = pd.DataFrame(data)

def update_new_sub(group):
pass_subjects = group[group['Mark'] == 'pass']['Subject']
group['New Sub.'] = ','.join(pass_subjects)
return group

df['New Sub.'] = df.groupby('Student').apply(update_new_sub)['New Sub.']
print(df)
© www.soinside.com 2019 - 2024. All rights reserved.