Soy un nuevo alumno de Python y estoy jugando con un conjunto de datos de interés para ayudarme con mi aprendizaje, en particular tratando de comprender mejor los pandas y numpy.

Mi marco de datos tiene más de un millón de filas y estoy tratando de crear un depósito personalizado para poder encontrar información más interesante. Mi conjunto de datos tiene el siguiente aspecto:

Mi DataTable:

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

Quiero agrupar los datos en grupos de precios de <100000, 200k - 300k, 300k - 500k, 500k + Luego, quiero agruparlos por tramos de precios, mes y área postal. Me estoy quedando perplejo al crear el segmento de precios personalizado.

Lo que he intentado hacer es crear una función personalizada:

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")


Y luego estoy creando una nueva columna en mi conjunto de datos de la siguiente manera:

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

Debería poder crear una aplicación a partir de esto, pero es un proceso extremadamente lento, ¡ya se está ejecutando a más de 30 minutos en un millón de filas y aún se está ejecutando!

Intenté jugar con la creación de depósitos personalizados de datos usando numpy y pandas (tabla dinámica, groupby, lambdas) pero no pude averiguar cómo incorporar la lógica del depósito personalizado.

Miré algunas otras respuestas como la siguiente, pero no cubría mis necesidades personalizadas particulares: Manera eficiente de asignar valores de otra columna pandas df

Cualquier ayuda muy apreciada!

0
kevo 16 oct. 2018 a las 16:56

2 respuestas

La mejor respuesta

Utilice la función apply para aplicar su función personalizada price_range a my_table

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

Si desea contenedores con el mismo rango:

my_table['price_range']=pd.cut(my_table['Price'], bins = 4, labels = ['Low Value', 'Medium Value', 'Medium High', 'High'])
1
Mohit Motwani 16 oct. 2018 a las 14:14

Puede intentar usar pd.cut para cortar el valor en rangos y especificar las etiquetas sobre qué asignar 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'])

Fuera:

0    Medium Value
1            High
2            High
3       Undefined
Name: Price, dtype: category
Categories (4, object): [Low_value < Medium Value < High < Undefined]
0
Naga Kiran 16 oct. 2018 a las 14:11