You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按学号分组在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:25:34