基于Pandas实现DataFrame连续行对比并创建新列y0Dash
解决Pandas DataFrame创建'y0Dash'列的需求
没问题,我来帮你搞定这个Pandas的新列创建需求!先确认下基础数据的加载代码,你提供的示例完全可用,先贴出来方便参考:
import pandas as pd data = '''\ y0 Size 25 8 37 8.7 68.5 9.3 93.4 11.4 110.7 14.6 145.6 12.1 180.3 10.9''' df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
接下来处理y0Dash列的创建逻辑。虽然你给出的规则写到一半断了,但结合常见的阈值判断场景,我推测完整逻辑应该是基于((df['y0'] - df['y0'].shift(-1)) / ((df['Size'] + df['Size'].shift(-1)) / 2))这个比值和MIN_Y0_DIFF = 0.3的阈值做判断。这里我先以**当该比值小于-MIN_Y0_DIFF时,y0Dash取后一行的y0值,否则保留当前行y0**为例(你可以根据实际需求调整条件后的操作):
完整实现代码
# 定义阈值常量 MIN_Y0_DIFF = 0.3 # 计算当前行与下一行的y0差值 y0_diff = df['y0'] - df['y0'].shift(-1) # 计算相邻两行Size的平均值 size_avg = (df['Size'] + df['Size'].shift(-1)) / 2 # 计算目标比值 ratio = y0_diff / size_avg # 按条件生成y0Dash列 df['y0Dash'] = df.apply( lambda row: df.loc[row.name + 1, 'y0'] if ratio.loc[row.name] < -MIN_Y0_DIFF else row['y0'], axis=1 ) # 单独处理最后一行(无下一行数据,这里默认保留原y0,可按需修改) df.loc[df.index[-1], 'y0Dash'] = df.loc[df.index[-1], 'y0']
关键逻辑解释
shift(-1)用于获取下一行的数据,这样能轻松计算相邻行的差值和平均值- 用
apply逐行判断条件,根据比值是否触发阈值来决定y0Dash的取值 - 最后一行因为没有下一行数据,单独处理避免索引越界
如果你的实际条件(比如比值的判断方向、阈值后的操作)和我假设的不一样,只需要修改apply里的条件和对应逻辑就可以啦。
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

