我正在处理与某些类别相对应的概率,并且我想将它们映射到pandas DataFrame的新列中感兴趣的类别。
我通常会将pandas.Series.map
用于此类任务,但在使用其他语言处理概率时会被截断,因此这不起作用。
我想知道是否可以将pd.Series.map
和np.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
答案 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