通过将不同数据框的2列中的值视为范围

时间:2018-03-15 20:46:11

标签: python python-2.7 pandas numpy dataframe

以下代码说明了该方案, 我有一个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

对于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;

针对此问题的任何解决方案?

1 个答案:

答案 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']