Пользовательские агрегаты Python - нужно более эффективное решение - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в Python и играю с интересным набором данных, чтобы помочь мне в обучении, в частности, чтобы лучше понять панд и numpy.

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

My DataTable:

Price    Postal_area    Purchase_Month
123000   SE22           2018_01
240000   GU22           2017_02
.
.
.

Я хочу сгруппировать данные в ценовые сегменты <100000, 200k - 300k, 300k - 500k, 500k + Я хочу затемсгруппировать по ценовым сегментам, месяцам и почтовым площадям.Я зашла в тупик при создании пользовательского ценового сегмента.</p>

Я пытался создать собственную функцию:

def price_range(Price):
    if (Price <= 100000):
        return ("Low Value")
    elif (100000 < Price < 200000):
        return ("Medium Value")
    elif (200001 < Price < 500000):
        return ("Medium High")
    elif (Price > 500001):
        return ("High")
    else:
        return ("Undefined")

И затем я создаю новый столбец в моем наборе данных следующим образом:

for val in (my_table.Price):
    my_table["price_range"] = (price_range(val))

Я должен быть в состоянии создать агг из этого, но это чрезвычайно медленный процесс - уже работает более 30 минут на миллион илитак грести и еще бегать!

Я пытался поиграть с созданием пользовательских блоков данных с использованием numpy и pandas (сводная таблица, groupby, lambdas), но не смог выяснить, как включить пользовательскую логику сегментов.

Я посмотрел на несколько других ответов, таких как приведенный ниже, но он не охватывал мои особые пользовательские потребности: Эффективный способ присвоения значений из другого столбца pandas df

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете попробовать использовать pd.cut, чтобы вырезать значение в диапазонах и указать метки для того, что назначить df

    Price
0   12300
1   24000
2   232455
3   343434343


pd.cut(df.Price,[0,100000,200000,500000,np.inf],labels=['Low_value','Medium Value','High','Undefined'])

Out:

0    Medium Value
1            High
2            High
3       Undefined
Name: Price, dtype: category
Categories (4, object): [Low_value < Medium Value < High < Undefined]
0 голосов
/ 16 октября 2018

Используйте функцию apply, чтобы применить свою пользовательскую функцию price_range к my_table

my_table['price_range']=my_table['Price'].apply(price_range)

Если вы хотите, чтобы лотки имели одинаковый диапазон:

my_table['price_range']=pd.cut(my_table['Price'], bins = 4, labels = ['Low Value', 'Medium Value', 'Medium High', 'High'])
...