gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:08 25 4
gpt4 key购买 nike

我有一个数据框 df['y0', 'size] 作为其中的两列。

y0 的浮点值从 25.0 到 800.0
size 是 float 据类型,其值从 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],其逻辑如下:

MIN_Y0_DIFF = 0.3

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)

我收到错误消息,我正在尝试将标量值与序列进行比较,我理解这一点 - 我正在尝试与 MIN_Y0_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)

最佳答案

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

看来主要问题是您如何尝试实现pd.Series.shift:df[['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)

结果:

      y0  Size  y0Dash
0 25.0 8.0 25.0
1 37.0 8.7 37.0
2 68.5 9.3 68.5
3 93.4 11.4 93.4
4 110.7 14.6 110.7
5 145.6 12.1 145.6
6 180.3 10.9 NaN

关于python - lambda 函数比较数据框中的两个连续行并创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com