根据授权值舍入 python 数据框列的值
Round values of a python dataframe column according to authorized values
我有这个数据框:
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 中的值并整理了您的 lambda 函数。
df = pd.DataFrame({'id':[1,2,3,4], 'score':[0.35,3.4,5.5,8]})
L = list(range(1,7))
df['score'] = df['score'].apply(lambda num : min(L, key=lambda x:abs(x-num)))
输出:
>>> df
id score
0 1 1
1 2 3
2 3 5
3 4 6
如果大型 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]
我有这个数据框:
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 中的值并整理了您的 lambda 函数。
df = pd.DataFrame({'id':[1,2,3,4], 'score':[0.35,3.4,5.5,8]})
L = list(range(1,7))
df['score'] = df['score'].apply(lambda num : min(L, key=lambda x:abs(x-num)))
输出:
>>> df
id score
0 1 1
1 2 3
2 3 5
3 4 6
如果大型 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]