有什么方法可以实现像数据帧上那样的实时运行功能吗?
我有一个虚构的数据框“课堂”,如下 - 一个虚构的实现来说明问题 -:
学生。 | 主题。 | 马克。 | 新子。 |
---|---|---|---|
迈克 | 英语 | 通过 | 英语 |
迈克 | 法语 | 通过 | 无 |
迈克 | 历史 | 通过 | 无 |
迈克 | 生物 | 失败 | 无 |
... | ...... | ...... | 无 |
**我想在“新子”列中实现值,这样对于每个学生,它都会检查所有科目的成绩,如果科目是“通过”,那么它将被附加到“新子”的当前列表中。它没有被添加,如果它是“失败”那么主题不应该被添加,以具有当前视图: **
学生。 | 主题。 | 马克。 | 新子。 |
---|---|---|---|
迈克 | 英语 | 通过 | 英语 |
迈克 | 法语 | 通过 | 英语、法语 |
迈克 | 历史 | 通过 | 英语、法语、历史 |
迈克 | 生物 | 失败 | 英语、法语、历史 |
... | ...... | ...... | 无 |
我尝试使用 (np.where) 来实现它:
Classroom["新子."]= np.where((Classroom["马克."]=="通过"),Classroom["新子."].shift(1)+","+["主题"],教室["新子。"])
问题在于“新子”。运行 np.where 时,列不会在运行时更新,所以我得到的是以下内容:
学生。 | 主题。 | 马克。 | 新子。 |
---|---|---|---|
迈克 | 英语 | 通过 | 英语 |
迈克 | 法语 | 通过 | 英语、法语 |
迈克 | 历史 | 通过 | 无,历史 |
迈克 | 生物 | 失败 | 无 |
... | ...... | ...... | 无 |
就好像它获取了“New Sub”的旧值。并且修改后没有得到以前的值。
有什么方法可以实现像数据帧上那样的实时运行功能吗?
使用“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)