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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:58:34