HOWTO · Pandas
Obtenha Valores Únicos de Pandas em Coluna e Classifique-os
Este tutorial demonstra como encontrar valores únicos de uma coluna em Pandas DataFrame e como classificá-la
Nesta página
Uma coluna de um DataFrame é uma Series do Pandas. Chame a sua unique() função para obter os valores distintos pela ordem em que aparecem pela primeira vez. Use drop_duplicates() quando precisar das linhas correspondentes e das respetivas outras colunas, ou ordene os valores ou as linhas com sorted() do Python ou com sort_values() do Pandas.
Os exemplos usam um DataFrame pequeno com profissões e departamentos. Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
professions = df["profession"].unique()
print(professions)
print(type(professions).__name__)
<StringArray>
['designer', 'engineer', 'analyst']
Length: 3, dtype: str
StringArray
Obter valores únicos de uma coluna do DataFrame
Selecionar df["profession"] devolve uma Series. A sua função unique() devolve um valor por cada profissão distinta, pela ordem em que surge pela primeira vez; não ordena os valores. O tipo concreto do resultado depende do dtype da Series. Neste exemplo, os valores usam o dtype de extensão string do Pandas, pelo que o resultado é um StringArray, como mostra a saída. Outros dtypes podem produzir um array NumPy ou outro array de extensão. Adapte o nome da coluna aos seus dados. Se precisar apenas do número de valores distintos, use len(df["profession"].unique()); len(df) conta as linhas, incluindo as que repetem profissões. Converta o resultado com .tolist() se o passo seguinte precisar especificamente de uma lista Python normal.
Manter uma linha por cada valor único da coluna
Quando a tarefa é manter registos, em vez de obter apenas uma coleção de valores, chame drop_duplicates(subset="profession") no DataFrame. O resultado continua a ser um DataFrame: cada linha mantida inclui o respetivo departamento e, por predefinição, conserva-se a primeira linha de cada profissão. No resultado apresentado, é removida a segunda linha de designer, enquanto a primeira linha de designer e o respetivo departamento de produto são mantidos. Isto não escolhe uma linha representativa com base noutra regra; se pretender manter um registo diferente, ordene as linhas ou selecione-as de outra forma antes. Por predefinição, o resultado conserva os rótulos do índice original, pelo que o índice pode ter lacunas. Pode passar vários nomes de colunas numa lista para subset quando os registos duplicados são definidos por uma combinação de colunas.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
unique_rows = df.drop_duplicates(subset="profession")
print(unique_rows.to_string(index=False))
print(type(unique_rows).__name__)
profession department
designer product
engineer platform
analyst finance
DataFrame
Ordenar valores únicos ou linhas do DataFrame
A função incorporada sorted() do Python devolve uma nova lista de valores por ordem crescente. Para ordenar os valores distintos, combine-a com unique(), ou ordene a Series diretamente se quiser manter os duplicados. Para obter ordem decrescente, passe reverse=True a sorted().
Use sort_values(by="profession") quando quiser ordenar as linhas e manter juntas as respetivas outras colunas. A função devolve um DataFrame e ordena por ordem crescente por predefinição; defina ascending=False para obter ordem decrescente. Estes exemplos são alternativas: ordenar os valores únicos produz uma lista, enquanto ordenar as linhas preserva os dados das linhas. Pode passar uma lista a by para ordenar por várias colunas, por ordem de prioridade. As listas apresentadas contêm apenas valores de profissão, mas o resultado final mantém todas as linhas e os respetivos departamentos, ordenando as profissões de engineer a analyst. sort_values() conserva os rótulos do índice original, a menos que peça ignore_index=True, que cria um novo índice sequencial para o resultado ordenado.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
print(sorted(df["profession"].unique()))
print(sorted(df["profession"].unique(), reverse=True))
print(df.sort_values(by="profession", ascending=False).to_string(index=False))
['analyst', 'designer', 'engineer']
['engineer', 'designer', 'analyst']
profession department
engineer platform
designer product
designer research
analyst finance