我有一个像这样的数据框:
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 数据帧中)?
答案 0 :(得分:3)
让我们使用 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
答案 1 :(得分:1)
方法一:
如果值固定为 [0.25, 0.5, 1.0],则使用:
np.round(df/0.125, 0) * 0.125
方法 2:
pd.cut
作为 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