gpt4 book ai didi

python - 在 Pandas 中找到下一个更高或更低的数字

转载 作者:行者123 更新时间:2023-12-04 07:53:16 24 4
gpt4 key购买 nike

我想将一个新列添加到我的 DataFrame 中,从具有 allowed_numbers_y 的外部数组中将下一个更高或更低的数字添加到 y。
我有:

allowed_numbers_y = [4,8,15,47]

df = pd.DataFrame({'x': [1,1,1,2,2,3,3,3,4,4,4],
'y': [5,12,13,14,15,16,17,25,21,10,9]})
df 输出如下所示:
    x   y
0 1 5
1 1 12
2 1 13
3 2 14
4 2 15
5 3 16
6 3 17
7 3 25
8 4 21
9 4 10
10 4 9
我想要这个:
    x   y    next_up_y  next_down_y
0 1 5 8 4
1 1 12 15 8
2 1 13 15 8
3 2 14 15 8
4 2 15 47 15
5 3 16 47 15
6 3 17 47 15
7 3 25 47 15
8 4 21 47 15
9 4 10 15 8
10 4 9 15 8
我有这个,但是由于我的数据框很大,我认为必须有更好的事情要做,而不是使用此函数遍历每一行。
def next_higher(my_list, my_number):  # finds the next higher number in list

jojo_list = list(my_list)
if not (len(list(filter(lambda x: x == my_number, my_list))) > 0): # Number exists
jojo_list.append(int(my_number))
jojo_list.sort()
jojo_list.index(int(my_number))
if my_number >= my_list[-1]: # my_number is the last in list
return my_list[-1]
else:
return jojo_list[jojo_list.index(my_number) + 1]

最佳答案

如果将允许列表转换为 Series ,您可以使用 idxmin() apply() .
对于 next_up_y :

  • allowed[allowed > y] - 获取大于 y 的值
  • .sub(y).abs() - 取与y差的绝对值
  • .idxmin() - 返回最小值的索引

  • 对于 next_down_y , 做同样的事情,但值小于 y ( allowed[allowed < y] )。
    allowed = pd.Series(allowed_numbers_y)

    df['next_up_y'] = df.y.apply(
    lambda y: allowed[allowed[allowed > y].sub(y).abs().idxmin()])
    df['next_down_y'] = df.y.apply(
    lambda y: allowed[allowed[allowed < y].sub(y).abs().idxmin()])
        x   y  next_up_y  next_down_y
    0 1 5 8 4
    1 1 12 15 8
    2 1 13 15 8
    3 2 14 15 8
    4 2 15 47 8
    5 3 16 47 15
    6 3 17 47 15
    7 3 25 47 15
    8 4 21 47 15
    9 4 10 15 8
    10 4 9 15 8

    注:如果速度很重要,请查看@Durtal 的 numpy解决方案,它不太直观,但速度快了几个数量级:


    方法
    %timeit


    Pandas
    11 女士 ± 1.46 ms 每个循环(7 次运行,每个循环 100 次)

    NumPy
    16.2 微秒 ± 1.27 µs 每个循环(7 次运行,每个循环 10000 次)

    关于python - 在 Pandas 中找到下一个更高或更低的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66835677/

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