Todos os produtos
Search
Central de documentação

MaxCompute:Ordenar, deduplicar, amostrar e transformar dados

Última atualização: Jun 26, 2026

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 sort ou sort_values para 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 ascending para 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-versicolor

    O 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-versicolor
    Nota

    Para ordenar dados em Python no MaxCompute (PyODPS), configure o parâmetro options.df.odps.sort.limit para 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 distinct das 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 unique para deduplicar uma sequência de dados. Contudo, não é possível usar a sequência resultante do método unique para selecionar colunas.

    >>> iris.name.unique()
                  name
    0      Iris-setosa
    1  Iris-versicolor
    2   Iris-virginica

    Exemplo 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:

Nota

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 replace como 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 frac para definir a proporção da amostra e o parâmetro n para 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_scale para 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_scale com o parâmetro feature_range para 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âmetro suffix.

    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_scale com o parâmetro group para 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.000000

    O exemplo anterior demonstra que os dados tanto em name1 quanto em name2 foram dimensionados com base nos valores mínimos e máximos de cada grupo.

  • Use o método std_scale para dimensionar os dados conforme a distribuição normal padrão. No método std_scale, configure o parâmetro preserve para manter a coluna original e o parâmetro group para 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 dropna para remover as linhas que contêm valores nulos no objeto subset.

    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 thresh para 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 fillna para 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  NaN

    Também é possível usar a função ffill ou bfill para simplificar o código. A função ffill equivale a fillna(method='ffill'). A função bfill corresponde a fillna(method='bfill').