在列pandas中找到最接近的值

时间:2020-06-20 13:50:07

标签: python pandas

我正在尝试为每个价格列查找当天可用的下一个最便宜的产品。我的数据看起来像这样

data = [['29/10/18', 400, 300, 200], 
        ['29/10/18', 250, 400, 100], 
        ['29/10/18', 600, 600, 300],
        ['30/10/18', 300, 500, 100]] 

df = pd.DataFrame(data, columns = ['date', 'price 1', 'price2', 'price3'])

我的输出看起来像这样

date     price1 nearestPrice1 price2 nearestPrice2 
29/10/18 400    250           300    400 
29/10/18 250    400           400    300
29/10/18 600    400           600    400

2 个答案:

答案 0 :(得分:1)

f = lambda row, col: df.loc[df[df['date'] == row['date']][col].sub(row[col])\
                    .abs().nsmallest(2).idxmax(), col]

df['nearest_price1'] = df.apply(f, col = 'price 1', axis = 1)
df['nearest_price2'] = df.apply(f, col = 'price2', axis = 1)
df['nearest_price3'] = df.apply(f, col = 'price3', axis = 1)

输出:

       date  price 1  price2  price3  nearest_price1  nearest_price2  \
0  29/10/18      400     300     200             250             400   
1  29/10/18      250     400     100             400             300   
2  29/10/18      600     600     300             400             400   
3  30/10/18      300     500     100             300             500   

   nearest_price3  
0             100  
1             200  
2             200  
3             100  

说明:

使用lambda函数f,将此函数应用于每列(price 1price2price3),然后获取结果。 它的工作方式如下:

  1. 通过sub和其他price中其他价格的date
  2. 它使用abs寻找两个最小的nsmallest价格。
  3. 最后,使用idxmax为第二个最小价格建立索引(因为第一个最小价格本身的绝对差值为0)

答案 1 :(得分:0)

如果我正确理解了这一点,则需要找到给定一天中最便宜的价格,从最便宜的到最便宜的,依此类推……

这意味着您需要首先提取给定日期的所有价格。您可以使用简单的for循环来执行此操作,例如,如果第一列中的文本为“ 29/10/18”,则将其余各列中的数据添加到列表中,或从中创建一个新的DataFrame。无论哪种情况,一旦获得了所有数据的价格,便可以使用熊猫提供的.sort_values函数,并指定您要使其升序。 Function documentation