将字典键映射到 pandas 数据框的列(如果它们接近)

Mapping dict keys to column of pandas dataframe if they're close

我正在处理与某些类别相对应的概率,我想将它们映射到 pandas DataFrame 的新列中感兴趣的类别。

我通常会使用 pandas.Series.map 来完成这样的任务,但在用另一种语言处理时概率已被截断,因此这不起作用。

我想知道是否可以将 pd.Series.mapnp.isclose 组合在一起,以便下面的示例可以按需要工作?任何替代方法也将不胜感激!

import pandas as pd

df = pd.DataFrame({
    'a': [1, 2, 3],
    'prob': np.round([0.6**(1/30.), 0.9**(1/10.), 0.8**(1/20.)], decimals = 4)
    })

prob_dict = {
    0.9**(1/10.): 'catA', 
    0.6**(1/30.): 'catB', 
    0.8**(1/20.): 'catC'}

df['cat'] = df.prob.map(prob_dict)

>> df
>>    a      prob  cat
>> 0  1  0.983117  NaN
>> 1  2  0.989519  NaN
>> 2  3  0.988905  NaN

我的 required/needed 输出是...

>> df
>>    a      prob  cat
>> 0  1  0.983117  catB
>> 1  2  0.989519  catA
>> 2  3  0.988905  catC

您的键和值混淆了。

prob_dict = {v: k for k, v in prob_dict.items()}

df['cat'] = df.prob.map(prob_dict)
print(df)

   a      prob   cat
0  1  0.983117  catB
1  2  0.989519  catA
2  3  0.988905  catC

在重塑 Prob 列在二维轴上。

将这些与字典的 .values() 方法进行比较,如果找到接近匹配,则 returns True

cond = np.isclose(df.prob.values[:, None], list(prob_dict.keys()), atol=10**-4)
indi = np.argwhere(cond)[:, 1]     # Get all column indices fulfilling the above condition
df['cat'] = np.array(list(prob_dict.values()))[indi]  # Let keys take on newly imputed slice