gpt4 book ai didi

python - 多条件 Pandas 操作的嵌套 numpy.where 的替代方案?

转载 作者:太空狗 更新时间:2023-10-30 00:55:10 28 4
gpt4 key购买 nike

我有一个带有条件列 A 和数字列 B 的 Pandas DataFrame。

    A    B
1 'foo' 1.2
2 'bar' 1.3
3 'foo' 2.2

我还有一个 Python 字典,它定义了 B 的范围,表示给定 A 的每个值“成功”。

mydict = {'foo': [1, 2], 'bar': [2, 3]}

我想在数据框中创建一个新列“错误”。它应该描述 B 的值超出 A 可接受范围的范围。如果 A 在范围内,则该值应为零。

    A    B   error
1 'foo' 1.2 0
2 'bar' 1.3 -0.7
3 'foo' 2.2 0.2

我不是一个完整的 Pandas/Numpy 新手,我在 Python 方面还算不错,但事实证明这有点困难。我不想用 iterrows() 来做,因为我知道这在计算上很昂贵,而且会被调用很多次。

我最终找到了一个解决方案,将 lambda 函数、pandas.DataFrame.map() 和嵌套的 numpy.where() 与可选的 x 和 y 输入的给定值结合起来。

getmin = lambda x: mydict[x][0]
getmax = lambda x: mydict[x][1]
df['error'] = np.where(df.B < dtfr.A.map(getmin),
df.B - df.A.map(getmin),
np.where(df.B > df.A.map(getmax),
df.B - df.A.map(getmax),
0
)
)

它有效,但这不可能是最好的方法,对吧?我觉得我在滥用 numpy.where() 来解决不知道如何以非迭代方式将数据帧的多列中的值映射到 lambda 函数的问题。 (同时避免编写稍微粗糙的 la​​mbda 函数)。

我猜是三个问题。

  1. 是否可以嵌套 numpy.where()s 进行三条件数组操作?
  2. 如何以非迭代方式从两个数据框列映射到一个功能?
  3. 如果 2) 可行且 1) 可以接受,哪个更可取?

最佳答案

关于如何映射多列的问题,您可以使用

DataFrame.apply( , axis =1)

对于你的问题,我认为你不需要这个,但我认为如果你分几步计算会更清楚:

df['low'] = df.A.map(lambda x: mydict[x][0])
df['high'] = df.A.map(lambda x: mydict[x][1])
df['error'] = np.maximum(df.B - df.high, 0) + np.minimum(df.B - df.low, 0)
df
A B low high error
1 foo 1.2 1 2 0.0
2 bar 1.3 2 3 -0.7
3 foo 2.2 1 2 0.2

关于python - 多条件 Pandas 操作的嵌套 numpy.where 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793178/

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