es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forzar un tipo de celda específico al importar datos desde Google Sheets con gspread y gspread_dataframe.

Estoy utilizando gspread_dataframe para importar datos de Google Sheets. Me gustaría forzar todos los datos importados a ser cadenas de texto, independientemente del tipo de celda utilizado en la hoja de cálculo.

Al leer la documentación de gspread_dataframe (disponible en https://github.com/robin900/gspread-dataframe), noté que puedo utilizar todas las opciones admitidas por los lectores de análisis de texto de Pandas (como este: https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html). En teoría, dtype=str o dtype="string" deberían forzar que todos los valores se importen con ese tipo específico. Sin embargo, parece que los datos se interpretan durante la importación.

En el escenario a continuación, el dataframe importado tiene decimales eliminados debido a que todos los “Amounts” están en formato “number” en la hoja de cálculo.

¿Puedo hacer que gspread_dataframe importe cada carácter de la celda tal como está, sin interpretar los datos de número (sin eliminar decimales en el camino)?

import gspread
import gspread_dataframe as gsframe

gsframe.get_as_dataframe(
    worksheet=sheet, 
    header=0, 
    dtype=str, 
    usecols=cols, 
    skiprows=row_offset,
    skip_blank_lines=True
).dropna(axis=0, how='all').fillna('')
 Google Sheets           DataFrame Importado 
string  number           string    string         

Name    Amount              Name    Amount    <-- Todos los decimales se eliminan
A      -25.00               A      -25
B       63.00               B       63
C       20.00               C       20
D      -10.00               D      -10
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para forzar que gspread_dataframe importe cada carácter en la celda tal cual, sin interpretar los datos numéricos, puedes utilizar el parámetro convert_float y establecerlo en False. Esto evitará que los números decimales se conviertan en enteros durante la importación, permitiéndote conservar los lugares decimales en tus datos.

    Aquí tienes un ejemplo de cómo modificar el código:

    import gspread
    import gspread_dataframe as gsframe
    
    gsframe.get_as_dataframe(
        worksheet=sheet, 
        header=0, 
        dtype=str, 
        usecols=cols, 
        skiprows=row_offset,
        skip_blank_lines=True,
        convert_float=False # Agrega este parámetro
    ).dropna(axis=0, how='all').fillna('')
    

    Con esta modificación, la columna Amount se almacenará correctamente como cadenas de texto con sus lugares decimales originales.

Comments are closed.