将dict键映射到pandas dataframe列,如果它们关闭的话

时间:2017-01-17 14:17:49

标签: python pandas numpy mapping closest

我正在处理与某些类别相对应的概率,并且我想将它们映射到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

我需要/需要的输出是......

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

2 个答案:

答案 0 :(得分:2)

你的键和值混在一起。

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

答案 1 :(得分:2)

您可以在重新整形 Prob 列中的值后,使用np.isclose以及要比较的值的指定绝对阈值(此处:atol=0.0001被选中)采取二维轴。

将这些与字典的.values()方法进行比较,如果找到匹配匹配则返回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

enter image description here