将字典键映射到 pandas 数据框的列(如果它们接近)
Mapping dict keys to column of pandas dataframe if they're close
我正在处理与某些类别相对应的概率,我想将它们映射到 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
我的 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
我正在处理与某些类别相对应的概率,我想将它们映射到 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
我的 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