Нахождение ближайшего значения в столбце pandas - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь найти для каждого столбца цен следующий самый дешевый продукт, доступный в день. мои данные выглядят примерно так

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 ]

1 голос
/ 20 июня 2020
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  

Объяснение:

Использует лямбда-функцию f, примените эту функцию к каждому столбцу (price 1, price2, price3) , и получает результаты. Он работает следующим образом:

  1. По sub price других цен в той же date.
  2. Ищет две наименьшие цены abs с использованием nsmallest.
  3. Наконец, используйте idxmax для индексации второй наименьшей цены (поскольку 1-я наименьшая цена сама по себе будет иметь абсолютную разницу в 0)
0 голосов
/ 20 июня 2020

Если я правильно понимаю, вам нужно найти самые дешевые цены на данный день, начиная с самых дешевых, затем самых дешевых и так далее ...

Это означает, что вам нужно сначала извлечь все цены на данный день. Вы можете сделать это с помощью простого для l oop, где, например, если текст в первом столбце - '29 / 10/18 ', затем добавьте данные из остальных столбцов в список или создайте новый DataFrame из него . В любом случае, когда у вас есть все цены на данные, вы можете использовать функцию .sort_values, предоставленную с pandas, и указать, что вы хотите, чтобы они были по возрастанию. Документация по функциям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...