Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Pandas: Dúvida com Transposição de dados

Boa tarde;

Pessoal, preciso de uma ajuda com um desenvolvimento de estudo de pandas; Fiz uma captura de dados via selenium de uma tabela de um site (fiis.com.br), transformando em um DataFrame e salvando o csv. Gostaria de uma ajuda para formatar com Pandas & Python, Onde Data Base, Data Pagamento, Cotação Base, Dividend Yield e Rendimento se tornarão as colunas e os dados logo em seguida deverão entrar nesse Dataframe nas Colunas.

O formato desses dados está assim: Arquivo teste.csv / dados retirados do site

0
"ÚLTIMOS DIVIDENDOS DO RBVA11
Data Base
Data Pagamento
Cotação Base
Dividend Yield
Rendimento
29.09.2023
16.10.2023
R$ 113,55
0,88%
R$ 1,00
29.09.2023
13.10.2023
R$ 113,55
0,88%
R$ 1,00
31.08.2023
15.09.2023
R$ 111,80
0,89%
R$ 1,00
31.07.2023
15.08.2023
R$ 110,00
0,91%
R$ 1,00
30.06.2023
14.07.2023
R$ 106,59
0,94%

O DataFrame criado, se encontra assim (Ignore que são dados diferentes, atentem-se à formatação)

    0
0	ÚLTIMOS DIVIDENDOS DO SDIL11
1	Data Base
2	Data Pagamento
3	Cotação Base
4	Dividend Yield
...	...
401	31.01.2017
402	14.02.2017
403	R$ 0,00
404	0,00%
405	R$ 0,52
3 respostas

Oi, Andre! Tudo bem?

No Pandas, podemos transformar os dados que estão em formato de linha para um formato de coluna utilizando algumas funções disponíveis na biblioteca, como por exemplo:

import pandas as pd

# Suponho que você tenha lido o csv para um DataFrame chamado df
df = pd.read_csv('teste.csv', header=None)

# Agora, vamos remodelar os dados
df_reshaped = pd.DataFrame(df.values.reshape(-1, 5), 
                           columns=['Data Base', 'Data Pagamento', 'Cotação Base', 'Dividend Yield', 'Rendimento'])

# Agora, o DataFrame df_reshaped deve estar no formato desejado
print(df_reshaped)

Nesse exemplo, o método reshape(-1, 5) está transformando os dados em um formato de matriz onde cada linha contém 5 elementos (que são os 5 campos mencionados). Em seguida, criamos um novo DataFrame com esses dados remodelados e definimos os nomes das colunas.

Entretanto, se houver alguma inconsistência nos dados (por exemplo, um registro que possui menos ou mais de 5 linhas), isso pode causar problemas. Portanto, verifique se os dados estão consistentes antes de aplicar essa solução.

Espero ter ajudado! Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓

Obrigado pela resposta! Mas ainda não é bem a solução do problema; o reshape não funciona bem pois ao ler minha df, só tem uma coluna (conforme abaixo) Sendo assim, se eu fizer um reshape ou um transpose direto, me retorna o erro ValueError: cannot reshape array of size 351 into shape (5) ** Tamanho: 351 rows × 1 columns** ​Exemplo de como o Dataframe aparece no notebook

Column 1Column 2
--0
0ÚLTIMOS DIVIDENDOS DO MALL11
1Data Base
2Data Pagamento
3Cotação Base
4Dividend Yield
......
34631.01.2018
34716.02.2018
348R$ 103,10
3490,47%
350R$ 0,48
Link do Notebook do projeto no meu GitHub

https://github.com/boechat/AutomacaoFII/blob/main/Intro%20a%20Python%20e%20Selenium.ipynb

solução!

Edit: Resolvido Caso queiram ver esse exercício, segue o link do meu gitHub A solução que apliquei foi a seguinte: Utilização de iterações para quebrar a tabela de uma coluna só dos registros, onde é descartada a primeira linha (i = 0) e transformada em colunas as linhas 1,2,3,4 e 5. As demais linhas são os dados que vão entrar nas colunas criadas, mas como estão de forma sequenciais, criei o iterador C que é inicializado em 0 e vai até 4 (0,1,2,3,4 - Indice das colunas). Eles recebem o valor ind (que seria igual ao df.value), nas colunas de posição[c] Ao chegar no valor limite do indice C, chamamos um dataframe de result_df , que recebe o conteudo dele mesmo adicionado da atual coluna_df, que passará por nova iteração até o final do processo. Ao final, dropa-se a primeira linha que continha informação lixo para o dataframe

Caso tenham em mente algo mais simples que isso, por favor, iluminem o caminho hahahah.


de = df #Dropa a primeira linha
i = 0
c = 0
coluna_df = pd.DataFrame()
result_df = coluna_df

for ind in de.values:
    if i==0:
        print('Dropar',ind)
    elif i > 0 and i < 6 :
        print('Cabeçalho', ind)
        #coluna_df = pd.DataFrame(columns=(ind))
        coluna_df[ind] = 'None'
        
        print(coluna_df)
    else:
        print(ind, i)
        print(c)
        # Atribua os valores pelo índice da coluna
        coluna_df[coluna_df.columns[c]] = ind
        c = c + 1
        if c >= 5:
            c = 0
            result_df = result_df.append(coluna_df, ignore_index=True)
    i=i+1
    
result_df = result_df.drop(range(1))