#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
… предполагая, что я правильно вас понял. Но я думаю, что я не понимаю ни вашей проблемы должным образом, ни вашего подхода к ее решению.