将数据框中的浮点数舍入到最接近的特定浮点值(舍入到非整数列表)
Round floats in a dataframe to nearest specific float values (rounding to a non integer list)
我有一个像这样的数据框:
dict_ = {'Col1':[0.54523, 0.24223, 0.94234],'Col2':[0.992324, 0.274336, 0.245435]}
df = pd.DataFrame(dict_, columns=dict_.keys())
Col1
Col2
0.54523
0.992324
0.24223
0.274336
0.94234
0.245435
我只想得到特定值 0.25, 0.5, 1.0
,将原始 df
数据帧四舍五入到最接近特定值的可能数字。
所以,我希望 df
成为:
Col1
Col2
0.5
1.0
0.25
0.25
1.0
0.25
如何在 python 中执行此操作(最好在 pandas 数据帧中)?
让我们使用 numpy 广播来计算 Col1
和 Col2
中每个值与数组 [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
方法一:
如果值固定为[0.25, 0.5, 1.0],则使用:
np.round(df/0.125, 0) * 0.125
方法二:
- use
pd.cut
as bins
添加列表中每个元素的平均值 [0, 0.25, 0.5, 1.0]
,所以 bins
是 [0, 0.125, 0.25, 0.375, 0.5, 0.75, 1.0]
.
- 并且
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
我有一个像这样的数据框:
dict_ = {'Col1':[0.54523, 0.24223, 0.94234],'Col2':[0.992324, 0.274336, 0.245435]}
df = pd.DataFrame(dict_, columns=dict_.keys())
Col1 | Col2 |
---|---|
0.54523 | 0.992324 |
0.24223 | 0.274336 |
0.94234 | 0.245435 |
我只想得到特定值 0.25, 0.5, 1.0
,将原始 df
数据帧四舍五入到最接近特定值的可能数字。
所以,我希望 df
成为:
Col1 | Col2 |
---|---|
0.5 | 1.0 |
0.25 | 0.25 |
1.0 | 0.25 |
如何在 python 中执行此操作(最好在 pandas 数据帧中)?
让我们使用 numpy 广播来计算 Col1
和 Col2
中每个值与数组 [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
方法一:
如果值固定为[0.25, 0.5, 1.0],则使用:
np.round(df/0.125, 0) * 0.125
方法二:
- use
pd.cut
asbins
添加列表中每个元素的平均值[0, 0.25, 0.5, 1.0]
,所以bins
是[0, 0.125, 0.25, 0.375, 0.5, 0.75, 1.0]
. - 并且
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