-1
I am developing a python program where I import two xlsx files directly with the Pandas library, I can import them easily, but I need to create a report between these two files.
How can I do?
-1
I am developing a python program where I import two xlsx files directly with the Pandas library, I can import them easily, but I need to create a report between these two files.
How can I do?
2
Importing the package
import pandas as pd
Loading the files:
lojas = pd.read_excel('./lojas.xlsx')
produtos = pd.read_excel('./produtos.xlsx')
Using Jay of the Pandas:
novo_df = produtos.set_index('Código da loja').join(lojas.set_index('Código da loja')).reset_index()
Reordering the columns:
novo_df = novo_df[['Código do produto','Nome do produto','preço','Código da loja','Nome da loja']]
Exit:
novo_df
Código do produto Nome do produto preço Código da loja Nome da loja
1A Corretivo líquido 18ml água 930761 Bic 5.70 100 Penha
2A Caneta esferográfica 1.0mm cristal 1.40 100 Penha
3A Lápis plástico preto evolution Pijama 1106666 ... 4.00 100 Penha
2A Caneta esferográfica 1.0mm cristal 1.38 101 Lins de Vasconcelos
1A Corretivo líquido 18ml água 930761 Bic 5.75 101 Lins de Vasconcelos
...
About the Join:
Join columns with another Dataframe in the index or in a key column. Efficiently join multiple Dataframe objects by index of one time by passing a list.
Update
As the requirement of the question changed I will put this update here.
Importing the package
import pandas as pd
Loading the files
lojas = pd.read_excel('./lojas.xlsx')
produtos = pd.read_excel('./produtos.xlsx')
Creating new data frame and reordering column presentation
novo_df = produtos.set_index('Código da loja').join(lojas.set_index('Código da loja')).reset_index()
novo_df = novo_df[['Código do produto','Nome do produto','preço','Código da loja','Nome da loja']]
Creating a "filter" to check the lowest prices grouped by product name and product code, then create a new data frame with the filtered values
filtro = novo_df.groupby(['Código do produto','Nome do produto'])['preço'].min()
menor_preco_df = novo_df[novo_df['preço'].isin(filtro)].sort_values(by = ['Código da loja']).reset_index(drop = True)
Here we create two data frames saving different information and then create a dictionary, the intention is to create a column with lists
df1 = menor_preco_df.groupby(['Código da loja','Nome da loja'])['Nome do produto'].apply(list).reset_index()
df2 = menor_preco_df.groupby(['Código da loja','Nome da loja'])['preço'].apply(list).reset_index()
df2.drop(columns = {'Código da loja','Nome da loja'}, inplace = True)
dicionario1 = pd.concat([df1,df2], axis = 1).to_dict('index')
Here prints the first part of the problem
for chave, valor in dicionario1.items():
print(f"{valor['Código da loja']} - {valor['Nome da loja']}")
for v,p in zip(valor['Nome do produto'],valor['preço']):
print(f" Produto: {v} - R${p}")
print('')
Exit:
100 - Penha
Produto: Lápis plástico preto evolution Pijama 1106666 Bic BT 3 - R$4.0
101 - Lins de Vasconcelos
Produto: Lápis plástico preto evolution Pijama 1106666 Bic BT 3 - R$4.0
102 - Curuça
Produto: Corretivo líquido 18ml água 930761 Bic - R$5.5
Produto: Lápis plástico preto evolution Pijama 1106666 Bic BT 3 - R$4.0
103 - Faria Lima
Produto: Corretivo líquido 18ml água 930761 Bic - R$5.5
104 - Jardim Brasil
Produto: Corretivo líquido 18ml água 930761 Bic - R$5.5
Produto: Caneta esferográfica 1.0mm cristal - R$1.2
Here we create the second dictionary grouped by product name and price
dicionario2 = menor_preco_df.groupby(['Nome do produto','preço'])['Nome da loja'].apply(list).reset_index().to_dict('index')
And here we print out the second part of the problem
for chave, valor in dicionario2.items():
print(f"{valor['Nome do produto']}")
print(f" - Produto encontrado por R${valor['preço']} nas lojas",', '.join(valor['Nome da loja']),'\n')
Exit:
Caneta esferográfica 1.0mm cristal
- Produto encontrado por R$1.2 nas lojas Jardim Brasil
Corretivo líquido 18ml água 930761 Bic
- Produto encontrado por R$5.5 nas lojas Curuça, Faria Lima, Jardim Brasil
Lápis plástico preto evolution Pijama 1106666 Bic BT 3
- Produto encontrado por R$4.0 nas lojas Penha, Lins de Vasconcelos, Curuça
Complete code
import pandas as pd
lojas = pd.read_excel('./lojas.xlsx')
produtos = pd.read_excel('./produtos.xlsx')
novo_df = produtos.set_index('Código da loja').join(lojas.set_index('Código da loja')).reset_index()
novo_df = novo_df[['Código do produto','Nome do produto','preço','Código da loja','Nome da loja']]
filtro = novo_df.groupby(['Código do produto','Nome do produto'])['preço'].min()
menor_preco_df = novo_df[novo_df['preço'].isin(filtro)].sort_values(by = ['Código da loja']).reset_index(drop = True)
df1 = menor_preco_df.groupby(['Código da loja','Nome da loja'])['Nome do produto'].apply(list).reset_index()
df2 = menor_preco_df.groupby(['Código da loja','Nome da loja'])['preço'].apply(list).reset_index()
df2.drop(columns = {'Código da loja','Nome da loja'}, inplace = True)
dicionario1 = pd.concat([df1,df2], axis = 1).to_dict('index')
for chave, valor in dicionario1.items():
print(f"{valor['Código da loja']} - {valor['Nome da loja']}")
for v,p in zip(valor['Nome do produto'],valor['preço']):
print(f" Produto: {v} - R${p}")
print('')
dicionario2 = menor_preco_df.groupby(['Nome do produto','preço'])['Nome da loja'].apply(list).reset_index().to_dict('index')
for chave, valor in dicionario2.items():
print(f"{valor['Nome do produto']}")
print(f" - Produto encontrado por R${valor['preço']} nas lojas",', '.join(valor['Nome da loja']),'\n')
Did you use Pycharm to show the results? Using here it does not show all columns , shows only a few on the console, would have to do some specific setting?
I am using the notebook jupyter. In the example above I cut the other lines because it would be too long here in the answer. About the columns I don’t know to inform you something about the pycharm because I don’t use it.
I was reading about pycharm and it seems that there is something in the debug called "View as data frame". Follow the link
The answer helped you?
helped too much thanks for explaining ! The Pycharm link also solved the problem, I added this in the print made that with print everything : print(products.head(3000). to_string())
How great that helped you! Nothing at all my dear! Consider dialing as an accepted answer (not mandatory but a good practice of the site). This helps people visualize that the question has already been solved and also encourages others to answer their questions. See how Big hug!
I just did it , if I were to use the gropu by to group like that? 100 - PENHA Ballpoint pen 1.0mm crystal 1.40 Corrective liquid 18ml water 930761 Bic 5,70 Black Plastic Pencil Evolution Pijama 1106666 Bic BT 3 4,00
You could group like this: novo_df.groupby(['Código do produto','Nome do produto'])['preço'].sum().reset_index()
. See if it’s what you imagined. Hug!
Let’s go continue this discussion in chat.
Browser other questions tagged python excel pandas
You are not signed in. Login or sign up in order to post.
CSS, good morning! Can you make the xlsx available? Hugs!
– lmonferrari
@lmonferrari Follow the example files: https://gofile.io/d/5TUFTS
– CSS