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

时间:2017-10-31 15:37:39

标签: python

我的数据框中包含名为“Atomic”的列中的数字。 我想将每个值四舍五入到一组给定值的最接近的数字。 例如:

'设置:5,10,20,25,50,100'

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

3 个答案:

答案 0 :(得分:1)

我想你可以把你的数字放到一个列表中

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

然后,您可以使用minkey来定义舍入函数:

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)