如何按学号分组在DataFrame中生成带顺序关联的Details列?
解决方案
可以通过分组移位或者分组内遍历两种方式实现需求,以下是具体代码示例:
方法1:利用groupby+shift()实现
先按学号分组,对科目列做移位操作获取每组内前一行的科目,再通过条件判断生成Details列:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({ 'Roll No': [1,1,1,2,2], 'Subject': ['Math', 'Physics', 'Chemistry', 'Biology', 'History'] }) # 分组后生成前一行科目列 df['prev_subject'] = df.groupby('Roll No')['Subject'].shift(1) # 生成Details列 df['Details'] = df.apply( lambda row: f"Other subject to {row['Subject']}" if pd.isna(row['prev_subject']) else f"{row['prev_subject']} to {row['Subject']}", axis=1 ) # 可选:删除辅助列prev_subject df.drop('prev_subject', axis=1, inplace=True)
方法2:分组内直接构造Details列表
对每个学号分组,手动构造第一行和后续行的内容:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'Roll No': [1,1,1,2,2], 'Subject': ['Math', 'Physics', 'Chemistry', 'Biology', 'History'] }) # 分组生成Details列 df['Details'] = df.groupby('Roll No').apply( lambda group: pd.Series( # 第一行固定格式 [f"Other subject to {group['Subject'].iloc[0]}"] + # 后续行用前一行科目拼接当前科目 [f"{group['Subject'].iloc[i-1]} to {group['Subject'].iloc[i]}" for i in range(1, len(group))] ) ).reset_index(drop=True)
两种方法最终都会得到如下结果:
Roll No Subject Details 0 1 Math Other subject to Math 1 1 Physics Math to Physics 2 1 Chemistry Physics to Chemistry 3 2 Biology Other subject to Biology 4 2 History Biology to History
内容的提问来源于stack exchange,提问作者Hey there
相关产品推荐
相关产品推荐

