Как я могу разделить мою нормализацию на две части в соответствии со значениями столбца?

#python-3.x #pandas #normalization #distribution

#python-3.x #pandas #нормализация #распределение

Вопрос:

ПРИВЕТ, у меня есть данные столбца в pandas с сильно искаженным распределением: распределение данных

Я разделил данные на две части в соответствии с предельным значением 1000, и это распределение двух групп. введите описание изображения здесь

Теперь я хочу нормализовать значения между 0-1. Я хочу выполнить «дифференциальную» нормализацию таким образом, чтобы значения левой панели были нормализованы между 0-0,5, а правая панель была нормализована до 0,5 к 1, все в одном столбце. Как я могу это сделать?

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

1. На всякий случай, поскольку разделение графика гистограммы очень необычно: у вас есть конкретная причина использовать этот подход или вы просто хотите правильно визуализировать это распределение? Если вы хотите последнее, попробуйте отобразить его как log ( plt.semilogy ) или double log ( plt.loglog )

2. Это не визуализация, причина в том, что я пытаюсь преобразовать это в изображение, переведя это в диапазон 0-255. Я хочу, чтобы низкие и высокие значения вносили вклад в изображение более или менее в одинаковой степени.

3. Помещение слов в кавычки волшебным образом не проясняет специфическое значение, которое вы не выписали.

4. @philipxy ок, понятно для других

Ответ №1:

Это некрасиво, но работает.

 df = pd.DataFrame({'dataExample': [0,1,2,1001,1002,1003]})

less1000 = df.loc[df['dataExample'] <= 1000]
df.loc[df['dataExample'] <= 1000, 'datanorm'] =  less1000['dataExample'] / (less1000['dataExample'].max() * 2)

high1000 = df.loc[df['dataExample'] > 1000]
df.loc[df['dataExample'] > 1000, 'datanorm'] =  ((high1000['dataExample'] - high1000['dataExample'].min()) / ((high1000['dataExample'].max() - high1000['dataExample'].min()) * 2)   0.5)

output:
    dataExample datanorm
0   0   0.00
1   1   0.25
2   2   0.50
3   1001    0.50
4   1002    0.75
5   1003    1.00
  

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

1. спасибо, близко к … нормализация в порядке, но я должен получить один столбец со всеми значениями, а получил два. Мне нужны две нормы, условные к <>1000, все в одном столбце.

Ответ №2:

Давайте предположим, что вызывается ваш фрейм данных df , вызывается столбец, содержащий данные data , и вызывается столбец, содержащий подсчеты counts . Тогда вы могли бы сделать что-то вроде этого:

 df['data_norm'] = df['data'].loc[df['counts']<=1000] / 1000 / 2
df['data_norm'] = df['data'].loc[df['counts']>1000] / df['counts'].max()   0.5
  

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