【问题标题】:Compare values ​from a DataFrame and replace with closest values, given a list比较 DataFrame 中的值并用最接近的值替换,给定一个列表
【发布时间】:2021-12-22 13:57:43
【问题描述】:

我有一个名为“Dataex”的 DataFrame,以及一个名为“steps”的升序列表。

import pandas as pd
import numpy as np

if __name__ == "__main__":

    Dataex = [[0.6,  0.36],
               [0.6,  0.36],
               [0.9,  0.81],
               [0.8,  0.64],
               [1.0,  1.00],
               [1.0,  1.00],
               [0.9,  0.81],
               [1.2,  1.44],
               [1.0,  1.00],
               [1.0,  1.00],
               [1.2,  1.44],
               [1.1,  1.21]]
            
    Dataex = pd.DataFrame(data = Dataex, columns = ['Lx', 'A'])
    
    steps = [0, 0.75, 1, 1.25, 1.5, 1.75 ,2, 2.25, 2.4, 2.5, 2.75, 3, 
                   3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5, 5.25, 5.5, 5.75, 6]
    
#    steps = np.array(steps) 
#    Dataex["Lx_new"] = steps[np.searchsorted(steps, Dataex["Lx"])]

我正在寻找的是:'Dataex ['Lx']'的每个值都与'steps'中找到的最接近的值进行比较,然后用最接近的限制替换,无论是向左还是向对了,我举几个例子来说明:

示例案例1:Dataex ['Lx'] = 0.8 与'steps'列表相比,它在[0.75 - 1]的区间之间,更接近下限,所以新的值必须是0.75。

示例情况2:Dataex ['Lx'] = 1.2 与列表'steps'相比,在[1 - 1.25]的区间之间,更接近上限,所以新的值必须是1.25 .

示例案例3:Dataex ['Lx'] = 1,这种情况如果我和'steps'比较,列表中有一个等于1的值,所以新的值必须相同,即1.

简而言之,我应该有这样的东西:

 Lx     A   Lx_new
0.6  0.36     0.75
0.6  0.36     0.75
0.9  0.81        1
0.8  0.64     0.75
  1     1        1
  1     1        1
0.9  0.81        1
1.2  1.44     1.25
  1     1        1
  1     1        1
1.2  1.44     1.25
1.1  1.21        1

【问题讨论】:

  • 有趣。 steps 中的数字似乎是一致的四分之一,例如,1、1.25、1.5、1.75、2 等,除了为 2,其中有一个 2.4在中间,数字像往常一样按季度进行。这是故意的吗?
  • 是的,这是故意的,来自之前的计算@user17242583

标签: python python-3.x pandas numpy


【解决方案1】:

这是否完成了您想要做的事情?

steps = np.array(steps)
Dataex["Lx_new"] = Dataex["Lx"].apply(lambda x: steps[np.argmin(np.abs(x-steps))])

【讨论】:

  • 太棒了!巧妙!
  • 如果您先将steps 转换为numpy 数组,即steps = np.array(steps),然后使用x - steps 而不是[x-s for s in steps],可能会更快。
  • 感谢@user17242583 的建议。我更新了我的答案以反映它。
  • 非常感谢您的贡献,美好的一天。
猜你喜欢
  • 2015-09-27
  • 2011-06-21
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2021-09-28
  • 2019-08-27
相关资源
最近更新 更多