lambda函数比较数据帧中的两个连续行并创建新列

2024-06-28 15:02:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df['y0', 'size],其中有两列。在

y0的浮点值从25.0到800.0
size是一个浮点数据类型,其值从8到25。在

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],其逻辑如下:

^{pr2}$

我得到了一个错误,我试图比较一个标量值和一个序列,我理解-我试图与minuy0_DIFF进行比较

但是,我不知道如何在lambda函数中实现这一点。如何比较两个连续的行以得到我想要的结果?在

我尝试了什么

def columnCompare():  
    if ((df['y0'] - df[['y0'].shift(-1)]) /
               ((df['Size'] + df[['Size'].shift(-1)]) / 2) < MIN_Y0_DIFF) ):
        df['y0Dash'] = df['y0']
    else:
        df['y0Dash'] = df['y0'].shift(-1)


df = df.apply(lambda x: columnCompare)

Tags: 数据lambdaimportdfdatasizeshiftdiff
1条回答
网友
1楼 · 发布于 2024-06-28 15:02:54

您不应该为此使用lambda函数。如果我正确理解您的逻辑,您可以计算一个布尔掩码,并以矢量化的方式应用您的逻辑。在

似乎主要的问题是如何实现pd.Series.shiftdf[['Size'].shift(-1)]不正确,因为list没有shift方法。在

MIN_Y0_DIFF = 0.3
mask = (df['y0'] - df['y0'].shift(-1)) / \
       ((df['Size'] + df['Size'].shift(-1)) / 2) < MIN_Y0_DIFF

df.loc[mask, 'y0Dash'] = df['y0']
df.loc[~mask, 'y0Dash'] = df['y0'].shift(-1)

结果:

^{pr2}$

相关问题 更多 >