Um problema com um DataFrame pandas é que ele precisa de alguns dados para criar sua estrutura. Portanto, pode ser um problema representar o caso no-row.
Por exemplo, suponha que eu tenha uma função que retorna uma lista de registros representados como dicionários: get_data() -> list[dict[str, Any]]
e eu queira ter uma função que retorne um DataFrame dos mesmos dados:
def get_dataframe() -> pd.DataFrame:
l = get_data()
df = pd.DataFrame(l)
return df
Isso funciona bem, exceto quando len(l)=0
o pandas precisa de pelo menos um registro para inferir o número de colunas e tipos de coluna. Não é ótimo retornar None neste caso porque você provavelmente precisaria escrever uma tonelada de instruções if/else downstream para lidar com o caso de registro zero. Idealmente, seria bom retornar um DataFrame vazio com o número correto de colunas e tipos de coluna para que não tenhamos que fazer um tratamento especial para o caso sem registro no código downstream. Mas é muito tedioso de fazer, porque:
- Em
get_dataframe()
, preciso especificar o número de colunas e tipos de colunas para criar um DataFrame vazio, mas essas informações já estão especificadas em outro lugar. É tedioso especificar as mesmas coisas duas vezes. - Como especifico as mesmas informações duas vezes, elas podem não ser consistentes. Então, eu precisaria adicionar código para verificar a consistência.
- Acredite ou não, o construtor DataFrame não aceita uma lista de dtypes. Existem soluções alternativas para especificar um tipo para cada coluna, mas isso não é conveniente.
Uma ideia para remover a redundância é que, em vez de representar os dados brutos como uma lista de dict, eu os represento como uma lista de dataclass, o que me permite anotar o tipo de cada campo. Posso então usar as informações de anotação para criar os tipos de coluna. Isso também não é o ideal porque a anotação de tipo é opcional, e também o mapeamento de tipos Python dtype
não é um para um.
Gostaria de saber como a situação de falta de dados geralmente é tratada.