python - 根据授权值舍入 python 数据框列的值

标签 python pandas list dataframe rounding

我有这个数据框:

df = pd.DataFrame({'id':[1,2,3,4], 'score':[0.35,3.4,5.5,8]})
df
  id  score
0  1   0.35
1  2    3.4
2  3    5.5
3  4      8

和这个列表:

L = list(range(1,7))
L
[1, 2, 3, 4, 5, 6]

我想将 df.scores 的值四舍五入为 L 中最接近的值。因此,我想得到:

df
  id  score
0  1      1
1  2      3
2  3      6
3  4      6

我试过类似的东西

df['score'].apply(lambda num : min([list(range(1,7)), key = lambda x:abs(x-num)])

但它没有用(我是一个非常初学者,如果这个尝试是胡说八道,我很抱歉)。

我该怎么办?感谢您的帮助

最佳答案

如果大型 DataFrame 和性能很重要,Numpy 解决方案会更好:

L = list(range(1,7))
a =  np.array(L)

df['score'] = a[np.argmin(np.abs(df['score'].values - a[:, None]), axis=0)]
print (df)
   id  score
0   1      1
1   2      3
2   3      5
3   4      6

它是如何工作的:

首先是将列表转换为数组:

print (a)
[1 2 3 4 5 6]

然后用 [:, None] 广播减去所有组合的二维数组:

print (df['score'].values - a[:, None])
[[-0.65  2.4   4.5   7.  ]
 [-1.65  1.4   3.5   6.  ]
 [-2.65  0.4   2.5   5.  ]
 [-3.65 -0.6   1.5   4.  ]
 [-4.65 -1.6   0.5   3.  ]
 [-5.65 -2.6  -0.5   2.  ]]

将值转换为绝对值:

print (np.abs(df['score'].values - a[:, None]))
[[0.65 2.4  4.5  7.  ]
 [1.65 1.4  3.5  6.  ]
 [2.65 0.4  2.5  5.  ]
 [3.65 0.6  1.5  4.  ]
 [4.65 1.6  0.5  3.  ]
 [5.65 2.6  0.5  2.  ]]

获取最小值的位置:

print (np.argmin(np.abs(df['score'].values - a[:, None]), axis=0))
[0 2 4 5]

所以如果使用索引获取a的值:

print (a[np.argmin(np.abs(df['score'].values - a[:, None]), axis=0)])
[1 3 5 6]

关于python - 根据授权值舍入 python 数据框列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59034464/

相关文章:

python - 根据其他列值生成列

r - 在 R 中组合两个列表

python - 如何从 Python 中的相关矩阵中识别重要项目(无内循环)

python - GPSD - 如何创建以纬度/经度作为输入的虚拟 GPS 源

python - 使用 pandas 在 matplotlib 中绘图

python - 从多列中查找 pandas

r - 从嵌套列表中提取元素到 data.matrix

R:将计算列添加到数据框列表中

python - 如何更有效地检查游戏板上的条纹?

python - Pandas date_range 从一周中的某一天开始,每周一次