Bin pandas float column на основе значения [duplicate]

allow_url_fopen обычно имеет значение Вкл. Если он не включен, вы можете попробовать две вещи.

  1. Создайте файл .htaccess и сохраните его в корневой папке (иногда это может потребовать разместить его на одну ступень назад в корневом каталоге) и вставьте этот код там.
    php_value allow_url_fopen On
    
  2. Создайте файл php.ini (для сервера обновлений php5.ini) и сохраните его в корневой папке (иногда может потребоваться разместить его на один шаг назад в корневом каталоге) и вставьте следующие код там:
    allow_url_fopen = On;
    

Я лично протестировал вышеупомянутые решения; они работали для меня.

1
задан jpp 19 April 2018 в 00:14
поделиться

2 ответа

На мой взгляд, вы не должны использовать вложенные if / else предложения для этой задачи.

Решение Pandas

Как предлагает @JonClements, вы также можете использовать pandas.cut для этого, преимущество в том, что ваш новый столбец становится категориальным .

Вам нужно только определить свои границы (в том числе np.inf ) и имена категорий, затем примените pandas.cut к нужной числовой колонке.

bins = [0, 2, 18, 35, 65, np.inf]
names = ['<2', '2-18', '18-35', '35-65', '65+']

df['AgeRange'] = pd.cut(df['Age'], bins, labels=names)

print(df.dtypes)

# Age             int64
# Age_units      object
# AgeRange     category
# dtype: object

Решение Numpy

numpy.digitize предоставляет другое чистое решение. Идея состоит в том, чтобы определить ваши границы и имена, создать словарь, а затем применить np.digitize к столбцу «Возраст». Наконец, используйте словарь для сопоставления имен вашей категории.

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

import pandas as pd, numpy as np

df = pd.DataFrame({'Age': [99, 53, 71, 84, 84],
                   'Age_units': ['Y', 'Y', 'Y', 'Y', 'Y']})

bins = [0, 2, 18, 35, 65]
names = ['<2', '2-18', '18-35', '35-65', '65+']

d = dict(enumerate(names, 1))

df['AgeRange'] = list(map(d.get, np.digitize(df['Age'], bins)))

Результат

   Age Age_units AgeRange
0   99         Y      65+
1   53         Y    35-65
2   71         Y      65+
3   84         Y      65+
4   84         Y      65+
6
ответ дан jpp 15 August 2018 в 22:32
поделиться
  • 1
    Или ... добавьте float('inf') (или np.inf) в конец bins, а затем используйте: pd.cut(df.Age, bins, labels=names) ... Таким образом вы получите категориальную серию вместо строки ... – Jon Clements♦ 20 March 2018 в 12:02
  • 2
    @jpp Это БРИЛЛИАНТ! Благодарим вас за то, что вы постарались дать такой ясный и продуманный ответ, и добавление в метод обрезки бункеров / панд с деталями - идеальное обледенение на торте. Это самый простой, самый элегантный подход, и я, конечно, пользуюсь его благодарю вас. Я видел где-то во всем, что я делал что-то о Бинс, но не понял, как применить его, и, конечно, не так легко! Еще раз спасибо! – kiltannen 20 March 2018 в 21:37

Набор данных:

relationship_status   col1   col2   col3   col4   col5   bday bday2  
0                  NaN  4.20  4.50  4.25  3.15  2.05  04-18  0418  
1                  1.0  4.60  2.95  3.95  3.10  3.10  07-20  0720  
2                  NaN  4.90  4.65  4.20  4.60  1.90  01-03  0103  
3                  NaN  3.85  2.80  3.55  2.65  3.50  09-16  0916  
4                  1.0  3.80  3.35  3.85  3.25  1.80  05-01  0501  

bins = [120, 219, 321, 420, 521, 621, 723, 823, 923, 1023, 1122, np.inf]
names = ['Aquarius', 'Pisces', 'Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius']
dataset['sunsign'] = pd.cut(dataset.bday2, bins, labels = names)

Я получаю ошибку: '& lt;' не поддерживается между экземплярами «float» и «str»

d = dict(enumerate(names, 1))
dataset['AgeRange'] = list(map(d.get, np.digitize(dataset['bday2'], bins)))

Я получаю следующую ошибку: не удается передать данные массива из dtype ('O') в dtype ('float64') в соответствии с правилом 'безопасный'

0
ответ дан Dave2e 15 August 2018 в 22:32
поделиться
  • 1
    Добро пожаловать в stackoverflow, This & quot; answer & quot; очевидно, является продолжением вашего предыдущего вопроса. Люди здесь @ SO очень полезны, но есть две вещи, которые вам нужно сделать, чтобы получить эту помощь. 1] задайте четкий вопрос 2] опубликуйте код, который вы уже пробовали. Я скопирую эту деталь выше в ваш другой вопрос - НО Я думаю, что по-прежнему будет отсутствовать некоторый код, поэтому вы должны добавить весь код, который используете – kiltannen 4 June 2018 в 02:17
  • 2
    для кого-то другого, кто нашел это - вот еще вопрос, заданный Ashish ...: stackoverflow.com/questions/50646397/… – kiltannen 4 June 2018 в 02:23
  • 3
    Я предложил изменить исходный вопрос, как я сказал выше. Это было отклонено, потому что предлагаемое мной слишком отличалось от вашего первоначального поста. Если вы действительно хотите ответить на этот вопрос - я предлагаю вам взять то, что вы разместили здесь, и самостоятельно отредактировать его в своем предыдущем вопросе. (Это не будет отвергнуто - как OP вы можете внести любые изменения, которые вам нравятся ...) – kiltannen 4 June 2018 в 22:23
Другие вопросы по тегам:

Похожие вопросы: