我正在尝试根据连续值所属的范围将一列连续浮点值映射到一些离散(分桶)值
例如
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
输出:
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
此时我使用 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/