我的数据框中包含名为“Atomic”的列中的数字。 我想将每个值四舍五入到一组给定值的最接近的数字。 例如:
'设置:5,10,20,25,50,100'
6-> 5,34-> 25,70-> 50
答案 0 :(得分:1)
我想你可以把你的数字放到一个列表中
set = [5, 10, 20, 25, 50, 100]
然后,您可以使用min
和key
来定义舍入函数:
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函数查找从目标value
到您可以舍入到的每个值的绝对距离,因此min
返回最接近{set
的元素value
{1}}。
答案 1 :(得分:0)
使用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]
答案 2 :(得分:0)
尝试pd.cut
import pandas as pd
df = pd.DataFrame({'atomic':[6,34,70]})
bins = [0,5,10,20,25,50,100]
labels = bins[:-1] # [0,5,10,20,25,50]
df['binned'] = pd.cut(df.atomic, bins, labels=labels)
df
atomic binned
0 6 5
1 34 25
2 70 50
请注意,binned是“类别”而不是数字。如果您需要使用数字
df['binned'] = pd.cut(df.atomic, bins, labels=labels).astype(int)