Добавьте буфер к числам, которые расположены слишком близко друг к другу, используя Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных pandas с несколькими текстовыми столбцами и столбцом значений. Я хочу добавить буфер (например, 0.2) к значениям, которые находятся в пределах определенного порога (1.0), к любому другому значению в dataframe.

https://colab.research.google.com/drive/1l6_S1M1LCsEWTIGZxt03NMGxL1bzzKlC?usp=sharing

Я мог бы сделать это чрезвычайно ручным способом, отсортировав и перебрав список значений и добавив их обратно в dataframe, но должен быть лучший способ сделать это с помощью pandas?

 for i, v in enumerate(values_list):
  if i > 0 and i < len(values_list) - 1:
    if (abs(v - values_list[i-1]) < THRESHOLD) or (abs(v - values_list[i 1]) < THRESHOLD):
      v  = BUFFER
      new_list.append(v)
    else:
      new_list.append(v)      
  else:
    new_list.append(v)
  

Комментарии:

1. Ваш код не выполняет то, что вы говорите, что хотите сделать. Вы сравниваете каждое значение только со значениями, смежными с ним в списке, но вы говорите, что хотите сравнить с «любым другим значением» в списке. Кроме того, добавление БУФЕРА не гарантирует, что в результате будет создан новый список, в котором элементы всегда отделены друг от друга более чем ПОРОГОВЫМ значением, поскольку ваше сравнение включает абсолютные значения, и вы всегда добавляете БУФЕР. Например, если v < values_list[i-1] . затем добавление БУФЕРА в v может сделать v ближе к values_list[i-1], а не дальше друг от друга. Это действительно то, чего вы хотите?

2. Нет, вы правы насчет буфера. По сути, все, что мне нужно, это способ выделить значения в списке, чтобы убедиться, что они не совпадают с любой другой точкой в списке. Причина этого в том, что они строятся с использованием d3, и я пытаюсь разделить точки с одинаковыми значениями X, Y, чтобы точки были видны.

3. Если вы подделаете значения точек перед их построением, вы не будете отображать свой фактический набор данных. Если ваш график состоит только из точек X, Y, почему бы просто не нарисовать их? Если 2 точки перекрываются, так тому и быть — это ничего не повредит. Если вы хотите рисовать текстовые метки в каждой точке, то у вас проблема с дизайном, а именно, как сделать разборчивый график, когда некоторые метки перекрываются? В этом случае у вас другая проблема, чем та, о которой спрашивали. Я не знаю, что такое d3, поэтому я, вероятно, не смогу помочь.

4. D3 — это просто библиотека визуализации JavaScript для рисования пользовательской графики. Обычно я бы не беспокоился о том, что точки X, Y перекрываются, как вы упомянули, из-за целостности данных.. но в этом случае координаты X, Y — это координаты отслеживаемых и отображаемых на векторной карте активов, поэтому подтасовка чисел на самом деле просто изменяет их на несколько градусов, чтобы они были видны. В этом случае точность данных не так важна, как возможность видеть активы на векторной карте.