【问题标题】:Assign values to a dataframe by considering values in 2 columns of different dataframe as range通过将不同数据框的 2 列中的值视为范围来为数据框分配值
【发布时间】:2018-08-24 19:42:12
【问题描述】:

下面的代码解释了这个场景, 我有一个包含 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  

失败并出现错误“ValueError:只能比较标签相同的系列对象”

有解决这个问题的办法吗?

【问题讨论】:

    标签: python python-2.7 pandas numpy dataframe


    【解决方案1】:

    一种方法是定义自定义映射函数并使用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 中的值进行比较。
    • 前 2 个 if 语句处理最小和最大边界。
    • 最后的else 语句使用一个生成器,它循环遍历df_ticker 中的每一行,并找到输入在Min_valMax_val 范围内的值的索引。
    • 最后,我们使用索引并通过.iloc 整数访问器将其输入df_ticker['Ticker']

    【讨论】:

    • 您的解决方案工作正常。但是,如果我将 df_values 中的值之一更改为与 df_ticker 中的最小值或最大值相同,它返回无。我们能做些什么来解决这个问题吗?如果你能解释一下逻辑,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多