如何在分组后的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))
有两个关键问题:
- 多余的
sum():这个聚合操作会把每组的数据合并成一行,破坏了原DataFrame的结构,而你需要保留原行数据,只是在组内做shift操作。 - 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)
执行后得到的结果完全符合你的预期:
| country | group | B | C | D | E |
|---|---|---|---|---|---|
| a1 | 1 | 10 | 20 | 40 | 41.0 |
| a2 | 1 | 11 | 21 | 41 | 42.0 |
| a3 | 1 | 12 | 22 | 42 | 43.0 |
| a4 | 1 | 13 | 23 | 43 | NaN |
| a1 | 2 | 50 | 60 | 80 | 81.0 |
| a2 | 2 | 51 | 61 | 81 | 82.0 |
| a3 | 2 | 52 | 62 | 82 | 83.0 |
| a4 | 2 | 53 | 63 | 83 | NaN |
额外说明
你提到用df = df[~df.isin([np.nan]).any(1)]删除含NaN的行有效,这个操作本身没问题,但如果只是为了生成E列,上面的核心代码已经足够,不需要提前聚合或额外复杂操作。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

