如何读取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
相关产品推荐
相关产品推荐

