如何创建列存储同名上一行的Value值,无前置值则留空?
问题分析与解决方法
你的代码存在几个关键问题:
- 嵌套循环逻辑混乱:外层遍历每行,内层又遍历整个Name列表,会导致
previous_value长度远大于原DataFrame行数,最终无法合并。 - 变量名错误:代码里
previous_followers.append("")中的previous_followers未定义,应该是previous_value。 - 匹配逻辑方向错误:你拿当前行的Name和下一行的Name对比,完全搞反了“取同一Name上一行值”的逻辑。
用Pandas内置的分组+位移方法可以高效解决这个需求,不需要手动写循环:
import pandas as pd # 假设你的原DataFrame是df df['Previous_value'] = df.groupby('Name')['Value'].shift(1).fillna('')
逻辑解释:
groupby('Name'):按姓名分组,确保只在同一人员的行内进行操作。shift(1):将每个分组内的Value列向下位移一行,当前行就能拿到同一人员上一行的Value值;首次出现的行因为没有前置行,会得到NaN。fillna(''):把NaN替换为空字符串,满足“无前置值则留空”的要求。
验证效果:
用你给出的预期数据测试,运行后结果与需求完全匹配:
| Name | Value | Previous_value | |
|---|---|---|---|
| 1 | Andrew | 12 | |
| 2 | Marco | 10 | |
| 3 | Philips | 9 | |
| 4 | Andrew | 8 | 12 |
| 5 | Oscar | 7 | |
| 6 | Peter | 15 | |
| 7 | Maria | 25 | |
| 8 | Marco | 3 | 10 |
| 9 | Andrew | 7 | 8 |
| 10 | Oscar | 19 | 7 |
| 11 | Oscar | 21 | 19 |
| 12 | Maria | 2 | 25 |
内容的提问来源于stack exchange,提问作者user20716077
相关产品推荐
相关产品推荐

