Análisis en Python Pandas: distinguir pulgadas versus centímetros

CorePress2024-01-25  14

Ni siquiera sé cómo abordar esta tarea. Necesito analizar esas cadenas con dimensiones no solo para convertir pulgadas a centímetros sino también para calcular el volumen en una celda adyacente. Bueno, calcular el volumen es fácil: multiplica L x W x H. Pero, ¿cómo reconocer las dimensiones al analizar pulgadas frente a cm para un manejo correcto? Esta es una tarea imposible como me parece ahora.

La conversión es bien conocida: 1 cm = 0,393701" (y por lo tanto 1" = 2,54 cm)

pequeña ilustración de ello

# this is my skeleton data
#
import pandas as pd
shop_df = pd.DataFrame({
    'Dimentions' : ['14.23" x 14.56" x 9.89"', '2.70cm x 22.30cm x 333.40cm', '23.45" x 21.99" x 45.76"'],
    'Volume, cm3' : ['???', '???', '???'],
})
shop_df

Consulte el recorrido introductorio, elCentro de ayuda y cómo hacer una buena pregunta para ver cómo funciona este sitio y ayudarle a mejorar sus preguntas actuales y futuras, lo que puede ayudarle a obtener mejores respuestas. "¿Muéstrame cómo resolver este problema de codificación?" está fuera de tema para Stack Overflow. Debe hacer un intento honesto de encontrar la solución y luego hacer una pregunta específica sobre su implementación. Stack Overflow no pretende reemplazar los tutoriales y la documentación existentes.

- Poda

27/03/2021 a las 19:21

Puedes utilizar expresiones regulares o manipulación de cadenas para distinguir cm y pulgadas.

- ThePyGuy

27/03/2021 a las 19:28

Gracias, Prune. Parece que me he rendido cuando vine aquí. ¡Gracias, ThePyGuy!

-DNay

27/03/2021 a las 21:37



------------------------------------

Esto funcionará bien para ti:

import pandas as pd

def volume(x):
    vol = 1
    for item in x:
        if '"' in item:
            status = "inch"
            v = item.replace('"', '')
            v = v.strip()
            vol*=float(v)
        elif 'cm' in item:
            status = "cm"
            v = item.replace('cm', '')
            v = v.strip()
            vol*=float(v)
    if status=="cm":
        return vol
    else:
        return vol*(2.54**3)


shop_df = pd.DataFrame({
    'Dimentions' : ['14.23" x 14.56" x 9.89"', '2.70cm x 22.30cm x 333.40cm', '23.45" x 21.99" x 45.76"'],
    'Volume, cm3' : ['???', '???', '???'],
})
for row in shop_df.iterrows():
    row[1]['Volume, cm3'] = volume(row[1]['Dimentions'].split("x"))
shop_df

1

Gracias, Lindo Panda, ¡esto es absolutamente genial!

-DNay

27/03/2021 a las 21:36



------------------------------------

Esta solución aplica una función que crea una lista de puntos flotantes a partir de las cadenas y convierte pulgadas a cm. Luego el volumen se calcula con np.prod:

import numpy as np
import pandas as pd
shop_df = pd.DataFrame({
    'Dimentions' : ['14.23" x 14.56" x 9.89"', '2.70cm x 22.30cm x 333.40cm', '23.45" x 21.99" x 45.76"'],
})

def split_data(cell):
    if '"' in cell:
        return [round(float(i)*2.54, 2) for i in cell.replace('"', '').split(' x ')]
    else:
        return [float(i) for i in cell.replace('cm', '').split(' x ')]

shop_df['Dimentions'] = shop_df['Dimentions'].apply(split_data)
shop_df['Volume'] = shop_df['Dimentions'].apply(np.prod)

Resultado:

Dimensiones Volumen 0 [36.14, 36.98, 25.12] 33571.8 1 [2.7, 22.3, 333.4] 20074 2 [59.56, 55.85, 116.23] 386630

1

Gracias, RJ Adriaansen, ¡esto es alucinante!

-DNay

27/03/2021 a las 21:35

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare