gpt4 book ai didi

python - 将列的值与大小递减的数组(或系列)进行比较

转载 作者:行者123 更新时间:2023-11-30 22:26:03 24 4
gpt4 key购买 nike

我有以下数据框。 (这不一定是数据帧;numpy 数组 df.values 上的解决方案也足够了)

np.random.seed(42)
df = pd.DataFrame(np.random.random((10,2)),columns=['a', 'b'])
df

a b
0 0.374540 0.950714
1 0.731994 0.598658
2 0.156019 0.155995
3 0.058084 0.866176
4 0.601115 0.708073
5 0.020584 0.969910
6 0.832443 0.212339
7 0.181825 0.183405
8 0.304242 0.524756
9 0.431945 0.291229

我想包含一个具有以下逻辑值的新列:

True:如果特定 a 值之后的任何 b 值大于该部分 a错误:否则

预期输出为:(请参阅下面一些行的解释)

       a           b      c
0 0.374540 0.950714 True
1 0.731994 0.598658 True
2 0.156019 0.155995 True
3 0.058084 0.866176 True <- np.any(0.058084 < np.array([0.708073, 0.969910, 0.212339, 0.183405, 0.524756, 0.291229]))
4 0.601115 0.708073 True <- np.any(0.601115 < np.array([0.969910, 0.212339, 0.183405, 0.524756, 0.291229]))
5 0.020584 0.969910 True <- np.any(0.020584 < np.array([0.212339, 0.183405, 0.524756, 0.291229]))
6 0.832443 0.212339 False <- np.any(0.832443 < np.array([0.183405, 0.524756, 0.291229]))
7 0.181825 0.183405 True <- np.any(0.181825 < np.array([0.524756, 0.291229]))
8 0.304242 0.524756 False <- np.any(0.304242 < np.array([0.291229]))
9 0.431945 0.291229 UNDEFINED <- Ignore this

上面的内容应该可以通过 for 循环实现,但是 pandas/numpy 的方法是什么?

我正在尝试一种将 lambda 函数应用于 a 的方法,但我找不到一种方法来获取相应 a 值的索引np.any 比较如上所示。 (不过,我后来发现 apply 只是 for 循环的语法糖)

df['c'] = df['a'].apply(lambda x: np.any(x < df['b'].values[<i>:])) # Where <i> is the respective index value of x; which I didn't know how to find

最佳答案

诀窍是在 b 上自下而上查找累积的最大值,并将这些值与 a 中的相应值进行比较。

因此,实现将是 -

a = df.a.values
b = df.b.values
out = a[:-1] < np.maximum.accumulate(b[::-1])[::-1][1:]

移植到pandas,对应的将是np.maximum.accumulatedf.cummax

示例运行 -

In [45]: df
Out[45]:
a b
0 0.374540 0.950714
1 0.731994 0.598658
2 0.156019 0.155995
3 0.058084 0.866176
4 0.601115 0.708073
5 0.020584 0.969910
6 0.832443 0.212339
7 0.181825 0.183405
8 0.304242 0.524756
9 0.431945 0.291229

In [46]: out
Out[46]: array([ True, True, True, True, True, True, False, True, False], dtype=bool)

关于python - 将列的值与大小递减的数组(或系列)进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47346738/

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