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

如何读取DataFrame列的上一行数据并按规则生成新列?

Pandas实现基于上一行值生成新列的逻辑

实现代码

用numpy.select可以高效完成这个逻辑,适合处理大数据量:

import pandas as pd
import numpy as np

# 创建示例DataFrame
df = pd.DataFrame({'val1': [5, 0, 14, 0, 70, 21]})

# 定义判断条件和对应结果
conditions = [
    # 条件1:上一行val1不为0
    (df['val1'].shift(1) != 0),
    # 条件2:上一行是0但当前行也是0
    (df['val1'].shift(1) == 0) & (df['val1'] == 0),
    # 条件3:上一行是0且当前行值在1-50之间
    (df['val1'].shift(1) == 0) & (df['val1'].between(1, 50)),
    # 条件4:上一行是0且当前行值大于50
    (df['val1'].shift(1) == 0) & (df['val1'] > 50)
]

values = [None, None, 1, 2]

# 生成val2列
df['val2'] = np.select(conditions, values, default=None)

print(df)

运行结果

val1   val2
0     5   None
1     0   None
2    14      1
3     0   None
4    70      2
5    21   None

关键逻辑解释

  • df['val1'].shift(1):将val1列向下偏移一行,当前行的该值即为上一行的val1值,第一行因无前置行,结果为NaN(会被第一个条件匹配,返回None)。
  • np.select:按顺序匹配条件列表中的规则,返回对应的值,所有未匹配的情况用default=None兜底。

备选方案(小数据场景)

如果数据量较小,也可以用apply逐行处理,但效率低于numpy.select:

def calculate_val2(row, df):
    # 获取上一行的val1值,第一行无前置行则返回None
    prev_val = df['val1'].iloc[row.name-1] if row.name > 0 else None
    if prev_val != 0:
        return None
    if row['val1'] == 0:
        return None
    return 1 if 1 <= row['val1'] <=50 else 2

df['val2'] = df.apply(calculate_val2, axis=1, args=(df,))

内容的提问来源于stack exchange,提问作者prof31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:33:20