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

如何在分组后的Pandas DataFrame中添加D列移位生成的E列?

解决分组DataFrame中新增组内shift列的问题

我来帮你搞定这个需求!你之前尝试的代码存在语法和逻辑上的小问题,咱们一步步修正,实现你想要的效果:

问题回顾

你有一个按country和group分组的DataFrame,希望新增列E,存储同组内D列向上移动1行(即shift(-1))的值,每组最后一行的E为NaN。

错误原因分析

你之前的代码:

df.groupby(['country','group']).sum().apply(lambda x['E']: x['D'].shift(-1))

有两个关键问题:

  1. 多余的sum():这个聚合操作会把每组的数据合并成一行,破坏了原DataFrame的结构,而你需要保留原行数据,只是在组内做shift操作。
  2. Lambda语法错误:lambda x['E']: ...这种写法不合法,Lambda的参数应该是一个变量名,而非索引形式。而且这里根本不需要用apply,直接对分组后的列做shift更简洁。

正确实现代码

直接通过groupby对D列执行shift(-1),然后赋值给新列E即可,groupby会自动在每组内独立执行shift操作:

import pandas as pd
import numpy as np

# 构造示例数据(模拟你的原始DataFrame)
data = {
    'country': ['a1', 'a2', 'a3', 'a4', 'a1', 'a2', 'a3', 'a4'],
    'group': [1, 1, 1, 1, 2, 2, 2, 2],
    'B': [10, 11, 12, 13, 50, 51, 52, 53],
    'C': [20, 21, 22, 23, 60, 61, 62, 63],
    'D': [40, 41, 42, 43, 80, 81, 82, 83]
}
df = pd.DataFrame(data)

# 核心操作:分组后对D列执行shift(-1),生成E列
df['E'] = df.groupby(['country', 'group'])['D'].shift(-1)

执行后得到的结果完全符合你的预期:

countrygroupBCDE
a1110204041.0
a2111214142.0
a3112224243.0
a41132343NaN
a1250608081.0
a2251618182.0
a3252628283.0
a42536383NaN

额外说明

你提到用df = df[~df.isin([np.nan]).any(1)]删除含NaN的行有效,这个操作本身没问题,但如果只是为了生成E列,上面的核心代码已经足够,不需要提前聚合或额外复杂操作。

内容的提问来源于stack exchange,提问作者Jonas Palačionis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:37:55