Este tópico descreve as operações executáveis em um DataFrame. Você pode ordenar, deduplicar, amostrar e dimensionar dados, além de processar valores nulos.
Pré-requisitos
Certifique-se de que os seguintes requisitos foram atendidos:
Uma tabela chamada pyodps_iris está preparada. Para mais informações, consulte a seção "Processamento de dados do DataFrame" em Primeiros passos.
-
Um DataFrame foi criado.
from odps.df import DataFrame iris = DataFrame(o.get_table('pyodps_iris'))
Ordenar dados
A ordenação de dados só é possível dentro de uma coleção.
-
Chame o método
sortousort_valuespara ordenar os dados.>>> iris.sort('sepalwidth').head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.2 2.2 4.5 1.5 Iris-versicolor 2 6.0 2.2 5.0 1.5 Iris-virginica 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 5.5 2.3 4.0 1.3 Iris-versicolor -
Adicione a configuração
ascending=False;para ordenar os dados em ordem decrescente.>>> iris.sort('sepalwidth', ascending=False).head(5) sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.5 4.2 1.4 0.2 Iris-setosa 2 5.2 4.1 1.5 0.1 Iris-setosa 3 5.8 4.0 1.2 0.2 Iris-setosa 4 5.4 3.9 1.3 0.4 Iris-setosa -
Use
-para ordenar os dados em ordem decrescente.>>> iris.sort(-iris.sepalwidth).head(5) sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.5 4.2 1.4 0.2 Iris-setosa 2 5.2 4.1 1.5 0.1 Iris-setosa 3 5.8 4.0 1.2 0.2 Iris-setosa 4 5.4 3.9 1.3 0.4 Iris-setosa -
Ordene os dados com base em vários campos.
>>> iris.sort(['sepalwidth', 'petallength']).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 4.0 1.0 Iris-versicolor 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 5.0 1.5 Iris-virginica 4 4.5 2.3 1.3 0.3 Iris-setosa -
Para ordenar dados com base em múltiplos campos em ordens diferentes, use o parâmetro
ascendingpara exibir uma lista dos dados a serem ordenados. O número de colunas deve corresponder ao número de campos. Os valores dos campos devem ser do tipo BOOLEAN.>>> iris.sort(['sepalwidth', 'petallength'], ascending=[True, False]).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 5.0 1.5 Iris-virginica 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 6.3 2.3 4.4 1.3 Iris-versicolorO código de exemplo a seguir mostra outra forma de ordenar dados com base em múltiplos campos.
>>> iris.sort(['sepalwidth', -iris.petallength]).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 5.0 1.5 Iris-virginica 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 6.3 2.3 4.4 1.3 Iris-versicolorNotaPara ordenar dados em Python no MaxCompute (PyODPS), configure o parâmetro
options.df.odps.sort.limitpara especificar o número de linhas a ordenar. O valor padrão do parâmetro options.df.odps.sort.limit é 10000. É possível definir esse parâmetro com um valor superior a 10000. No entanto, essa configuração pode causar um problema de falta de memória (OOM).
Deduplicar dados
-
Para remover duplicatas em uma coleção, chame o método
distinctdas seguintes formas:-
>>> iris[['name']].distinct() name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginica -
>>> iris.distinct('name') name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginica -
>>> iris.distinct('name', 'sepallength').head(3) name sepallength 0 Iris-setosa 4.3 1 Iris-setosa 4.4 2 Iris-setosa 4.5
-
-
Chame o método
uniquepara deduplicar uma sequência de dados. Contudo, não é possível usar a sequência resultante do métodouniquepara selecionar colunas.>>> iris.name.unique() name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginicaExemplo de código inválido:
>>> iris[iris.name, iris.name.unique()]
Amostrar dados
Para obter uma amostra de dados de uma coleção, chame o método sample. O PyODPS oferece suporte aos seguintes métodos de amostragem:
O MaxCompute DataFrame deve ter suporte a XFlow nos projetos para executar os métodos de amostragem a seguir, exceto a amostragem por partes. Caso o MaxCompute DataFrame não ofereça suporte a XFlow, esses métodos só poderão ser executados no backend do Pandas DataFrame.
-
Amostragem por partes
Neste método, os dados são divididos em
parts. Selecione a parte por número.>>> iris.sample(parts=10) # Split data into 10 parts and sample data of the part numbered 0 by default. >>> iris.sample(parts=10, i=0) # Split data into 10 parts and manually sample data of the part numbered 0. >>> iris.sample(parts=10, i=[2, 5]) # Split data into 10 parts and sample data of the parts numbered 2 and 5. >>> iris.sample(parts=10, columns=['name', 'sepalwidth']) # Sample the data by name and sepalwidth. -
Amostragem ponderada
Ao utilizar este método, especifique a coluna de peso, o número de registros e a proporção de registros para a amostragem. Para ativar a amostragem com reposição, defina o parâmetro
replacecomo True.>>> iris.sample(n=100, weights='sepal_length') >>> iris.sample(n=100, weights='sepal_width', replace=True) -
Amostragem estratificada
Nesta abordagem, especifique a coluna de rótulo para estratificação, bem como a proporção ou o número de registros a amostrar. Configure o parâmetro
fracpara definir a proporção da amostra e o parâmetronpara determinar a quantidade de registros. Este método não oferece suporte à amostragem com reposição.>>> iris.sample(strata='category', n={'Iris Setosa': 10, 'Iris Versicolour': 10}) >>> iris.sample(strata='category', frac={'Iris Setosa': 0.5, 'Iris Versicolour': 0.4})
Dimensionar dados
Um DataFrame permite dimensionar dados com base no valor máximo, mínimo, médio ou no desvio padrão. O exemplo a seguir ilustra alguns dados de entrada.
name id fid
0 name1 4 5.3
1 name2 2 3.5
2 name2 3 1.5
3 name1 4 4.2
4 name1 3 2.2
5 name1 3 4.1
-
Use o método
min_max_scalepara normalizar os dados.df.min_max_scale(columns=['fid']) name id fid 0 name1 4 1.000000 1 name2 2 0.526316 2 name2 3 0.000000 3 name1 4 0.710526 4 name1 3 0.184211 5 name1 3 0.684211 -
Use o método
min_max_scalecom o parâmetrofeature_rangepara definir o intervalo de valores de saída. O exemplo abaixo demonstra como manter os valores de saída no intervalo de (-1, 1):df.min_max_scale(columns=['fid'], feature_range=(-1, 1)) name id fid 0 name1 4 1.000000 1 name2 2 0.052632 2 name2 3 -1.000000 3 name1 4 0.421053 4 name1 3 -0.631579 5 name1 3 0.368421 -
Caso precise preservar os valores originais, use o parâmetro
preserve. Os dados dimensionados serão adicionados como uma nova coluna. Por padrão, o nome dessa coluna recebe o sufixo _scaled anexado ao nome da coluna original. Para alterar o nome do sufixo, use o parâmetrosuffix.df.min_max_scale(columns=['fid'], preserve=True) name id fid fid_scaled 0 name1 4 5.3 1.000000 1 name2 2 3.5 0.526316 2 name2 3 1.5 0.000000 3 name1 4 4.2 0.710526 4 name1 3 2.2 0.184211 5 name1 3 4.1 0.684211 -
Aplique o método
min_max_scalecom o parâmetrogrouppara indicar uma ou mais colunas de agrupamento e obter os valores mínimo e máximo da coluna especificada para o dimensionamento.df.min_max_scale(columns=['fid'], group=['name']) name id fid 0 name1 4 1.000000 1 name1 4 0.645161 2 name1 3 0.000000 3 name1 3 0.612903 4 name2 2 1.000000 5 name2 3 0.000000O exemplo anterior demonstra que os dados tanto em
name1quanto emname2foram dimensionados com base nos valores mínimos e máximos de cada grupo. -
Use o método
std_scalepara dimensionar os dados conforme a distribuição normal padrão. No métodostd_scale, configure o parâmetropreservepara manter a coluna original e o parâmetrogrouppara agrupar os dados.df.std_scale(columns=['fid']) name id fid 0 name1 4 1.436467 1 name2 2 0.026118 2 name2 3 -1.540938 3 name1 4 0.574587 4 name1 3 -0.992468 5 name1 3 0.496234
Processar valores nulos
Um DataFrame permite excluir linhas com valores nulos e preencher esses valores. Dados de exemplo:
id name f1 f2 f3 f4
0 0 name1 1.0 NaN 3.0 4.0
1 1 name1 2.0 NaN NaN 1.0
2 2 name1 3.0 4.0 1.0 NaN
3 3 name1 NaN 1.0 2.0 3.0
4 4 name1 1.0 NaN 3.0 4.0
5 5 name1 1.0 2.0 3.0 4.0
6 6 name1 NaN NaN NaN NaN
-
Use o método
dropnapara remover as linhas que contêm valores nulos no objetosubset.df.dropna(subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 5 name1 1.0 2.0 3.0 4.0 -
Para manter as linhas que possuem pelo menos um valor não nulo, adicione a configuração
how='all'.df.dropna(how='all', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 1 1 name1 2.0 NaN NaN 1.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 -
Use o parâmetro
threshpara definir a quantidade mínima de valores não nulos exigida em uma linha.df.dropna(thresh=3, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 -
Chame o método
fillnapara substituir valores nulos por constantes ou por valores de uma coluna existente.-
O exemplo a seguir ilustra a substituição de valores nulos por constantes:
df.fillna(100, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 100.0 3.0 4.0 1 1 name1 2.0 100.0 100.0 1.0 2 2 name1 3.0 4.0 1.0 100.0 3 3 name1 100.0 1.0 2.0 3.0 4 4 name1 1.0 100.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 100.0 100.0 100.0 100.0 -
O exemplo abaixo demonstra como substituir valores nulos utilizando valores de uma coluna existente:
df.fillna(df.f2, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 1 1 name1 2.0 NaN NaN 1.0 2 2 name1 3.0 4.0 1.0 4.0 3 3 name1 1.0 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaN
-
-
O DataFrame suporta preenchimento regressivo e progressivo para lidar com valores nulos. A tabela a seguir define os valores válidos para o parâmetro
method.Valor
Descrição
bfill ou backfill
Preenchimento regressivo
ffill ou pad
Preenchimento progressivo
Exemplo
df.fillna(method='bfill', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 3.0 3.0 4.0 1 1 name1 2.0 1.0 1.0 1.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 1.0 1.0 2.0 3.0 4 4 name1 1.0 3.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaN df.fillna(method='ffill', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 1.0 3.0 4.0 1 1 name1 2.0 2.0 2.0 1.0 2 2 name1 3.0 4.0 1.0 1.0 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 1.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaNTambém é possível usar a função
ffilloubfillpara simplificar o código. A funçãoffillequivale afillna(method='ffill'). A funçãobfillcorresponde afillna(method='bfill').