将Python数据帧值舍入到给定的一组数字中

将Python数据帧值舍入到给定的一组数字中,python,Python,我有一个数据框,在一个名为“原子”的列中有数字。 我想将每个值四舍五入到给定值集中最接近的数字中 例如: set : 5, 10, 20, 25, 50, 100 6 --> 5 34 --> 25 70 --> 50 我该怎么做呢?我假设您可以将您的一组数字放入一个列表中 set=[5,10,20,25,50,100] 然后,您可以使用带有键的min定义舍入函数: def custom_round(set, value): return min(set, ke

我有一个数据框,在一个名为“原子”的列中有数字。 我想将每个值四舍五入到给定值集中最接近的数字中

例如:

set : 5, 10, 20, 25, 50, 100

 6 -->  5
34 --> 25
70 --> 50

我该怎么做呢?

我假设您可以将您的一组数字放入一个列表中

set=[5,10,20,25,50,100]

然后,您可以使用带有
键的
min
定义舍入函数:

def custom_round(set, value):
    return min(set, key=lambda x:abs(x-value))
如果有许多值需要计算,则可以将其与列表理解相结合,例如

values = [1,2,5,6,8,9,10,25,28,99]
rounded = [custom_round(set, v) for v in values]
这里发生了什么事?


min
与lambda函数组合作为键时,该函数首先应用于数组中的所有元素,然后返回与此新数组的min对应的原始数组的元素。在上面的示例中,lambda函数查找从目标
到您可以舍入到的每个值的绝对距离,因此
min
返回
set
的元素,该元素最接近

,我假设您能够将您的一组数字放入列表中

set=[5,10,20,25,50,100]

然后,您可以使用带有
键的
min
定义舍入函数:

def custom_round(set, value):
    return min(set, key=lambda x:abs(x-value))
如果有许多值需要计算,则可以将其与列表理解相结合,例如

values = [1,2,5,6,8,9,10,25,28,99]
rounded = [custom_round(set, v) for v in values]
这里发生了什么事?


min
与lambda函数组合作为键时,该函数首先应用于数组中的所有元素,然后返回与此新数组的min对应的原始数组的元素。在上面的示例中,lambda函数查找从目标
到您可以舍入到的每个值的绝对距离,因此
min
返回
set
的元素,该元素最接近
使用
abs
+
min
+列表理解

s =  [5, 10, 20, 25, 50, 100]
l = [6, 34, 70]
[ k[0] for k in [ min([(i,abs(i-j)) for i in s],key=lambda x:x[1]) for j in l ] ]
#Output:
#[5, 25, 50]

使用abs
+
min
+列表理解

s =  [5, 10, 20, 25, 50, 100]
l = [6, 34, 70]
[ k[0] for k in [ min([(i,abs(i-j)) for i in s],key=lambda x:x[1]) for j in l ] ]
#Output:
#[5, 25, 50]
尝试:

请注意,bined是一个“类别”,而不是一个数字。如果您需要号码,请使用

df['binned'] = pd.cut(df.atomic, bins, labels=labels).astype(int)
尝试:

请注意,bined是一个“类别”,而不是一个数字。如果您需要号码,请使用

df['binned'] = pd.cut(df.atomic, bins, labels=labels).astype(int)

prob覆盖内置的round函数不是一个好的做法,但在其他方面很酷!是的,说得好!我对答案进行了编辑,以免这样做;)我试图使用函数
set=[0.1,0.2,0.25,0.5,1,2,5,10,20,25,50,100,200,250,500,1000,2000,2500,5000,10000]def custom_round(set,value):返回df中index1行的min(set,key=lambda x:abs(x-value)):df[“newatomirounded”]=custom_round(set,df[“NewAtomic”]
而我得到的
序列的真值是不明确的。请使用a.empty、a.bool()、a.item()、a.any()或a.all().
prob覆盖内置的round函数不是一个好的做法,但在其他方面很酷!是的,很好的观点!我编辑了答案以便不这样做;)我正在尝试使用函数
set=[0.1,0.2,0.25,0.5,1,2,5,10,20,25,50,100,200,250,500,1000,2500,5000,10000]来迭代数据帧def custom_round(set,value):返回index1的min(set,key=lambda x:abs(x-value)),df.iterrows():df[“newatomicound”]=custom_round(set,df[“NewAtomic”])
和I get
序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any或a.all()。