python - pandas 在包含间隔的列中查找值

标签 python pandas lookup intervals

我正在尝试根据连续值所属的范围将一列连续浮点值映射到一些离散(分桶)值

例如

df_lookup = pd.DataFrame(data=[[0.0, 0.3, 10.1],
                               [0.3, 0.65, 30.3],
                               [0.65, 1.0, 50.5]], 
                        columns=['start', 'end', 'mapped_value'])
# create intervals
df_lookup['interval'] = df_lookup.apply(lambda x: 
                                             pd.Interval(x['start'], 
                                                         x['end'], 
                                                         closed='both' if x['end']==1.0 else 'left'), axis=1)

df_lookup

输出:

<表类=“s-表”> <标题> 开始 结束 mapped_value 间隔 <正文> 0 0.00 0.30 10.1 [0.0, 0.3) 1 0.30 0.65 30.3 [0.3, 0.65) 2 0.65 1.00 50.5 [0.65,1.0]
df_data=pd.DataFrame(data=[['A', 0.3],
                           ['B', 0.65],
                           ['C', 0.6],
                           ['D', 0.75],
                           ['E', 0.4]], 
                     columns=['ID', 'original_value'])
df_data
<表类=“s-表”> <标题> ID 原始值 <正文> 0 一个 0.30 1 B 0.65 2 C 0.60 3 D 0.75 4 E 0.40

此时我使用 pandas.DataFrame.apply获取我的查找值但是

df_data['mapped_value'] = df_data.apply(
        lambda x: df_lookup.loc[x['original_value'] in df_lookup['interval']]['mapped_value'], 
            axis=1)

但是这告诉我 KeyError: 'False: boolean label can not be used without a boolean index' 就爆炸了

进一步的调查显示我遇到的问题是当我执行 in 时我只得到一个返回的 bool 值,而不是 bool 值列表,例如,对于数据 ID= 'A'其中original value是 0.3,我希望 x['original_value'] in df_lookup['interval']将返回[False, True, False]但事实上它正在返回 False

我希望能在这里指导一下如何实现这个“查找”映射。谢谢

最佳答案

您可以使用pandas.merge_asof如果间隔可能不相交,则可选检查上限:

df_data['mapped_value'] = (pd
 .merge_asof(df_data.sort_values(by='original_value'),
             df_lookup,
             left_on='original_value', right_on='start')
 # assign command below is only required if the intervals are disjoint
 .assign(mapped_value=lambda d: d['mapped_value']
                                .mask(d['end'].lt(d['original_value'])))
 ['mapped_value']
)

输出:

  ID  original_value  mapped_value
0  A            0.30          30.3
1  B            0.65          30.3
2  C            0.60          30.3
3  D            0.75          50.5
4  E            0.40          50.5

关于python - pandas 在包含间隔的列中查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72475600/

相关文章:

python - 数据框到字典,包括字典列表

python - 在服务器运行时通过 django-admin 添加自定义权限

python - 如何加入 pandas dataframe 以便 seaborn boxplot 或 violinplot 可以使用列作为色调?

css - 手写笔查找哈希名称

使用 dplyr (R) 根据查找表重新编码值

ruby-on-rails - Rails Gem Geocoder Lookup方法不遵守/config/initializers/geocoder.rb

python - ansible 无法使用 "brew install ansible"命令完美安装在 MacOS 中不起作用?错误 : -sh:/usr/local/bin/ansible: No such file or directory

python求解未知变量的方程

python - 如何根据其他列中的一个而不是两个条件删除重复项

python - 在存在空值的日期上使用 lambda 和 strftime (Pandas)