Podemos usar o loc dessa forma também, para pegar múltiplos índices (no caso, dois) de uma coluna:
print(dfNotif.loc[("Brazil", "12/14/20"), :])
Para pegar todas as datas atribuídas ao Brasil:
print(dfNotif.loc["Brazil", :])
Caso queira pegar mais de um país:
print(dfNotif.loc[(("Brazil", "US"), "12/14/20"), :])
E também mais de uma data:
print(dfNotif.loc[(("Brazil", "US"), ("12/14/20", "12/14/21")), :])
E um intervalo de datas:
print(dfNotif.loc[("Brazil", "12/14/20") : ("Brazil", "12/14/21")])
Para a gente voltar pros índices anteriores, podemos fazer assim:
print(dfNotif.reset_index())
Esse comando acima reseta tudo que foi feito no código.
Podemos resetar por level (coluna), por exemplo, contando a partir do 0:
print(dfNotif.reset_index(level = 0))
E com o 1:
print(dfNotif.reset_index(level = 1))
Para ver os tipos dos dados resetados:
dfNotif.reset_index(inplace = True)
print(dfNotif.dtypes)
Só que veja que datas é identificado como object, ele deveria ser identificado como datetime. Para converter, faça assim:
dfNotif["Datas"] = pd.to_datetime(dfNotif["Datas"], format = "%m/%d/%y")
print(dfNotif.dtypes)
Depois, é só retirar o dtypes e mostrar o print puro, assim:
print(dfNotif)
Para transformar o dado para que possamos utilizar, podemos usar o método pivot.
No caso, podemos fazer de uma coluna um novo index, por exemplo, entre outras coisas. É uma forma de estruturar as colunas.
Vamos fazer assim:
print(dfNotif.pivot(index = "Datas", columns = "País/Região", values = "Notificações"))
No caso acima, as datas vão ser os índices e cada país será uma coluna.
E para definir um plot:
dfNotif = dfNotif.pivot(index = "Datas", columns = "País/Região", values = "Notificações")
print(dfNotif.plot(y = "Brazil", use_index = True, grid = True, figsize = (12, 8)))
plt.show() # Coloque import matplotlib.pyplot as plt
PS: Instale a biblioteca matplotlib antes e importe ela. Ela é pra gerar gráficos.
Com uma lista de países:
dfNotif.plot(y = ["Brazil", "US", "Italy", "China"], use_index = True, grid = True, figsize = (12, 8))
plt.show() # Coloque import matplotlib.pyplot as plt
Resumidamente, o que fizemos inicialmente foi isso:
import pandas as pd
link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/refs/heads/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
dfNotif = pd.read_csv(link)
dfNotif.drop(["Lat", "Long"], axis = 1, inplace = True)
print(dfNotif)
Agrupando somando:
dfNotif = dfNotif.groupby(by = ["Country/Region"]).sum()
print(dfNotif)
Invertendo linhas e colunas com a opção T
(não apague o groupby):
dfNotif = dfNotif.T
print(dfNotif)
Personalizando nome de uma das colunas (não apague os códigos anteriores):
dfNotif.index.set_names("Datas", inplace = True)
print(dfNotif)
Exibindo os índices:
print(dfNotif.index)
Defina essas linhas no código, no lugar do print dfNotif (não apague as outras configurações do mesmo):
link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/refs/heads/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
dfDeaths = pd.read_csv(link)
dfDeaths.drop(["Lat", "Long"], axis = 1, inplace = True)
dfDeaths = dfDeaths.groupby(by = ["Country/Region"]).sum()
dfDeaths = dfDeaths.T
dfDeaths.index.set_names("Datas", inplace = True)
print(dfDeaths)
E no lugar do último print acima:
dfDeaths.plot(y = ["Brazil", "US", "Italy", "China"], use_index = True, grid = True, figsize = (12, 8), logy = True)
plt.show() # Coloque import matplotlib.pyplot as plt
O merge, basicamente, ele funde dois dataframes em apenas um só. No caso, colocaremos o notifications na esquerda e o deaths na direita.
Faça assim no final do código, antes do plot:
dfNotif.merge(dfDeaths, on = "Datas", how = "left", sort = True)
No lugar do plot e do plt, abaixo do merge:
brNotif = dfNotif[["Brazil"]]
brNotif.columns = ["Notifications"]
print(brNotif)
O mesmo com o deaths:
brDeaths = dfDeaths[["Brazil"]]
brDeaths.columns = ["Deaths"]
print(brDeaths)
E ao fundir, deixe apenas esse print, tirando o merge anterior pra não dar conflitos:
brNotif.merge(brDeaths, on = "Datas", how = "left", sort = True)
print(brNotif)
Fazendo o fatiamento, retirando os dois primeiros índices de brNotif e os dois últimos de brDeaths, no lugar do merge anterior:
brNotif.iloc[2:, :].merge(brDeaths.iloc[:-2, :], on = "Datas", how = "left", sort = True)
print(brNotif)
Isso é pra remover as ocorrencias com NaN
.
Troque o left
de merge por right
. Pra ele não privilegiar nem o da direita nem o da esquerda, fazendo uma junção geral, coloque outer
.