以下代码说明了该方案, 我有一个3列
的数据帧(df_ticker)import pandas as pd
df_ticker = pd.DataFrame({'Min_val': [22382.729,36919.205,46735.164,62247.61], 'Max_val': [36901.758,46716.06,62045.06,182727.05],
'Ticker':['$','$$','$$$','$$$$']})
df_ticker`
df_ticker 我的第二个数据框包含2列
df_values = pd.DataFrame({'Id':[1,2,3,4,5,6],'sal_val': [3098,45639.987,65487.4,56784.8,8,736455]})
df_values `
对于df_values [' sal_val']中的每个值,我想检查它在df_ticker [Max_val]和df_ticker [min_val]中的范围,并相应地分配df_ticker [ticker]。
示例输出将是这样的,sample_output
在示例输出中,sal_val = 3098大于或等于Min_val = 22382.729且小于或等于max_val = 36901.75,它被指定为ticker = $
我尝试了以下内容,
df_values['ticker']=df_ticker.\
loc[((df_values['sal_val']>=df_ticker['Min_val'])| (df_values['sal_val']<=df_ticker['Max_val']))]['Ticker']
df_values
失败并出现错误&#34; ValueError:只能比较带有相同标签的Series对象&#34;
针对此问题的任何解决方案?
答案 0 :(得分:0)
一种方法是定义自定义映射函数并使用pd.Series.apply
。
def mapper(x, t):
if x < t['Min_val'].min():
index = 0
elif x >= t['Max_val'].max():
index = -1
else:
index = next((idx for idx, (i, j) in enumerate(zip(t['Min_val'], t['Max_val']))\
if i <= x < j), None)
return t['Ticker'].iloc[index] if index is not None else None
df_values['Ticker'] = df_values['sal_val'].apply(mapper, t=df_ticker)
<强>结果强>
Id sal_val Ticker
0 1 3098.000 $
1 2 45639.987 $$
2 3 65487.400 $$$$
3 4 56784.800 $$$
4 5 8.000 $
5 6 736455.000 $$$$
<强>解释强>
pd.Series.apply
接受自定义映射函数作为输入。sal_val
中的每个条目,并通过if / else结构将其与df_ticker
中的值进行比较。if
语句涉及最小和最大边界。else
语句使用生成器,该生成器循环遍历df_ticker
中的每一行,并查找输入在Min_val
和{{1}范围内的值的索引}。Max_val
整数访问器将其提供给df_ticker['Ticker']
。