将数据框中的浮点数舍入到最接近的特定浮点值(舍入到非整数列表)

时间:2021-01-31 10:51:45

标签: python pandas dataframe rounding

我有一个像这样的数据框:

final_arr = numpy.array([[out_arr[0, 0], out_arr[0, 1], out_arr[0, 2]], [out_arr[1, 0], out_arr[1, 1], out_arr[1, 2]]])
<头>
Col1 Col2
0.54523 0.992324
0.24223 0.274336
0.94234 0.245435

而且我只想拥有特定值 dict_ = {'Col1':[0.54523, 0.24223, 0.94234],'Col2':[0.992324, 0.274336, 0.245435]} df = pd.DataFrame(dict_, columns=dict_.keys()) ,将原始 0.25, 0.5, 1.0 数据框四舍五入到特定值上最接近的可能数字。

所以,我希望 df 成为:

<头>
Col1 Col2
0.5 1.0
0.25 0.25
1.0 0.25

如何在 python 中执行此操作(最好在 Pandas 数据帧中)?

2 个答案:

答案 0 :(得分:3)

让我们使用 numpy 广播来计算 Col1Col2 中每个值与数组 [0.25, 0.5, 1.0] 中的值之间的绝对差异,然后使用 .argmin 找到最接近值的索引:

c = ['Col1', 'Col2']

a = np.array([0.25, 0.5, 1.0])
idx = np.abs(df[c].values[:, :, None] - a).argmin(axis=-1)
df[c] = a[idx]

结果:

   Col1  Col2
0  0.50  1.00
1  0.25  0.25
2  1.00  0.25

答案 1 :(得分:1)

方法一:

如果值固定为 [0.25, 0.5, 1.0],则使用:

np.round(df/0.125, 0) * 0.125

方法 2:

  1. 使用 pd.cut 作为 bins 将列表 [0, 0.25, 0.5, 1.0] 中每个元素的平均值相加,因此 bins[0, 0.125, 0.25, 0.375, 0.5, 0.75, 1.0]
  2. 并将 lable 设置为 [0, 0.25, 0.25, 0.5, 0.5, 1.0]
bins = [0, 0.25, 0.5, 1.0]
labels = sorted(bins + bins)[1:-1]
print(labels) # [0, 0.25, 0.25, 0.5, 0.5, 1.0]

obj = pd.Series(bins)
bins += ((obj + obj.shift(1))/2) .dropna().tolist()
bins.sort()
print(bins) # [0, 0.125, 0.25, 0.375, 0.5, 0.75, 1.0]

dfn = pd.DataFrame()
for col in df.columns:
    dfn[col] = pd.cut(df[col], bins=bins, 
                      labels=labels, 
                      ordered=False)

print(dfn)

       Col1  Col2
    0  0.50  1.00
    1  0.25  0.25
    2  1.00  0.25
相关问题