Como expandir a exibição de saída para ver mais colunas de um DataFrame do pandas?


623

Existe uma maneira de ampliar a exibição da saída no modo interativo ou de execução de script?

Especificamente, estou usando a describe()função em um panda DataFrame. Quando DataFrametem 5 colunas (rótulos) de largura, recebo as estatísticas descritivas que desejo. No entanto, se DataFrametiver mais alguma coluna, as estatísticas serão suprimidas e algo assim será retornado:

>> Index: 8 entries, count to max  
>> Data columns:  
>> x1          8  non-null values  
>> x2          8  non-null values  
>> x3          8  non-null values  
>> x4          8  non-null values  
>> x5          8  non-null values  
>> x6          8  non-null values  
>> x7          8  non-null values  

O valor "8" é fornecido se houver 6 ou 7 colunas. A que se refere o "8"?

Eu já tentei arrastar a janela IDLE para maior, além de aumentar as opções de largura "Configurar IDLE", sem sucesso.

Meu objetivo é usar pandas e describe()evitar o uso de um segundo programa, como o Stata, para manipulação e investigação de dados básicos.

Respostas:


890

Atualização: Pandas 0.23.4 em diante

Isso não é necessário, o pandas detecta automaticamente o tamanho da janela do seu terminal, se você definir pd.options.display.width = 0. (Para versões mais antigas, veja na parte inferior.)

pandas.set_printoptions(...)está obsoleto. Em vez disso, use pandas.set_option(optname, val)ou equivalente pd.options.<opt.hierarchical.name> = val. Gostar:

import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

Aqui está a ajuda paraset_option :

set_option (pat, value) - Define o valor da opção especificada

Opções disponíveis:
display. [chop_threshold, colheader_justify, column_space, date_dayfirst,
         date_yearfirst, codificação, expand_frame_repr, float_format, height,
         line_width, max_columns, max_colwidth, max_info_columns, max_info_rows,
         max_rows, max_seq_items, mpl_style, multi_sparse, notebook_repr_html,
         pprint_nest_depth, precisão, largura]
[sim_interactive, use_inf_as_null]

Parâmetros
----------
pat - str / regexp que deve corresponder a uma única opção.

Nota: correspondências parciais são suportadas por conveniência, mas a menos que você use o
nome completo da opção (egxyzoption_name), seu código poderá ser quebrado no futuro
versões se novas opções com nomes semelhantes forem introduzidas.

valor - novo valor da opção.

Devoluções
-------
Nenhum

Levanta
------
KeyError se não existir essa opção

display.chop_threshold: [padrão: Nenhum] [atualmente: Nenhum]
: flutuar ou Nenhum
        se definido como um valor flutuante, todos os valores flutuantes menores que o limite especificado
        será exibido exatamente como 0 por repr e amigos.
display.colheader_justify: [padrão: direita] [atualmente: direita]
: 'esquerda direita'
        Controla a justificação dos cabeçalhos das colunas. usado pelo DataFrameFormatter.
display.column_space: [padrão: 12] [atualmente: 12] Nenhuma descrição disponível.

display.date_dayfirst: [padrão: False] [atualmente: False]
: boleano
        Quando Verdadeiro, imprime e analisa datas primeiro com o dia, por exemplo, 20/01/2005
display.date_yearfirst: [padrão: False] [atualmente: False]
: boleano
        Quando Verdadeiro, imprime e analisa datas primeiro com o ano, por exemplo, 20/01/2005
display.encoding: [padrão: UTF-8] [atualmente: UTF-8]
: str / unicode
        O padrão é a codificação detectada do console.
        Especifica a codificação a ser usada para cadeias retornadas por to_string,
        geralmente são seqüências destinadas a serem exibidas no console.
display.expand_frame_repr: [padrão: True] [atualmente: True]
: boleano
        Se deve imprimir a versão completa do DataFrame para grandes DataFrames
        através de várias linhas, `max_columns` ainda é respeitado, mas a saída será
        envolver várias "páginas" se a largura exceder o `display.width`.
display.float_format: [padrão: Nenhum] [atualmente: Nenhum]
: callable
        O chamador deve aceitar um número de ponto flutuante e retornar
        uma sequência com o formato desejado do número. Isto é usado
        em alguns lugares como SeriesFormatter.
        Veja core.format.EngFormatter para um exemplo.
display.height: [padrão: 60] [atualmente: 1000]
: int
        Descontinuada.
        (Descontinuado, use `display.height`.)

display.line_width: [padrão: 80] [atualmente: 1000]
: int
        Descontinuada.
        (Descontinuado, use `display.width`.)

display.max_columns: [padrão: 20] [atualmente: 500]
: int
        max_rows e max_columns são usados ​​nos métodos __repr __ () para decidir se
        to_string () ou info () é usado para renderizar um objeto em uma string. Em caso
        python / IPython está sendo executado em um terminal, isso pode ser definido como 0 e pandas
        detectará corretamente a largura do terminal e trocará para um menor
        formato, caso todas as colunas não se ajustem verticalmente. O notebook IPython,
        O IPython qtconsole ou IDLE não é executado em um terminal e, portanto, não é
        possível fazer a detecção automática correta.
        Valor 'Nenhum' significa ilimitado.
display.max_colwidth: [padrão: 50] [atualmente: 50]
: int
        A largura máxima em caracteres de uma coluna no repr de
        uma estrutura de dados de pandas. Quando a coluna estourar, um "..."
        espaço reservado é incorporado na saída.
display.max_info_columns: [padrão: 100] [atualmente: 100]
: int
        max_info_columns é usado no método DataFrame.info para decidir se
        por coluna, as informações serão impressas.
display.max_info_rows: [padrão: 1690785] [atualmente: 1690785]
: int ou Nenhum
        max_info_rows é o número máximo de linhas para as quais um quadro será
        execute uma verificação nula em suas colunas ao reprogramar em um console.
        O padrão é 1.000.000 de linhas. Portanto, se um DataFrame tiver mais
        1.000.000 de linhas, não haverá verificação nula realizada no
        colunas e, portanto, a representação levará muito menos tempo para
        exibido em uma sessão interativa. Um valor Nenhum significa sempre
        execute uma verificação nula ao repr'ing.
display.max_rows: [padrão: 60] [atualmente: 500]
: int
        Isso define o número máximo de linhas que os pandas devem gerar ao imprimir
        várias saídas. Por exemplo, esse valor determina se o repr ()
        para um quadro de dados imprime totalmente ou apenas um resumo de repr.
        Valor 'Nenhum' significa ilimitado.
display.max_seq_items: [padrão: Nenhum] [atualmente: Nenhum]
: int ou Nenhum

        ao imprimir bastante uma sequência longa, não mais que `max_seq_items`
        será impresso. Se os itens forem omitidos, eles serão indicados pela adição
        de "..." para a sequência resultante.

        Se definido como Nenhum, o número de itens a serem impressos é ilimitado.
display.mpl_style: [padrão: Nenhum] [atualmente: Nenhum]
: bool

        Definir isso como 'padrão' modificará os rcParams usados ​​pelo matplotlib
        para dar às plotagens um estilo visual mais agradável por padrão.
        Definir como Nenhum / Falso restaura os valores ao seu valor inicial.
display.multi_sparse: [padrão: True] [atualmente: True]
: boleano
        exibição MultiIndex "sparsify" (não exibe repetida
        elementos em níveis externos dentro de grupos)
display.notebook_repr_html: [padrão: True] [atualmente: True]
: boleano
        Quando Verdadeiro, o notebook IPython usará a representação html para
        objetos pandas (se estiverem disponíveis).
display.pprint_nest_depth: [padrão: 3] [atualmente: 3]
: int
        Controla o número de níveis aninhados a serem processados ​​durante a impressão bonita
display.precision: [padrão: 7] [atualmente: 7]
: int
        Precisão de saída de ponto flutuante (número de dígitos significativos). Isto é
        apenas uma sugestão
largura de exibição: [padrão: 80] [atualmente: 1000]
: int
        Largura da exibição em caracteres. Caso o python / IPython esteja sendo executado em
        um terminal que pode ser definido como Nenhum e os pandas detectarão corretamente
        largura.
        Observe que o notebook IPython, IPython qtconsole ou IDLE não são executados em um
        terminal e, portanto, não é possível detectar corretamente a largura.
mode.sim_interactive: [padrão: False] [atualmente: False]
: boleano
        Se simular o modo interativo para fins de teste
mode.use_inf_as_null: [padrão: False] [atualmente: False]
: boleano
        True significa tratar None, NaN, INF, -INF como nulo (maneira antiga),
        False significa Nenhum e NaN são nulos, mas INF, -INF não são nulos.
        (novo caminho).
Chame def: pd.set_option (self, * args, ** kwds)

EDIT: informações da versão mais antiga, muito disso foi preterido.

Como o @bmu mencionou , o pandas detecta automaticamente (por padrão) o tamanho da área de exibição, uma exibição resumida será usada quando um repr de objeto não couber no visor. Você mencionou o redimensionamento da janela IDLE, sem efeito. Se o fizer print df.describe().to_string(), ele se encaixa na janela IDLE?

O tamanho do terminal é determinado por pandas.util.terminal.get_terminal_size()(descontinuado e removido), isso retorna uma tupla contendo o (width, height)da exibição. A saída corresponde ao tamanho da sua janela IDLE? Pode haver um problema (havia um antes ao executar um terminal no emacs).

Observe que é possível ignorar a detecção automática, pandas.set_printoptions(max_rows=200, max_columns=10)nunca mudará para a exibição resumida se o número de linhas e colunas não exceder os limites especificados.


A opção 'max_colwidth' ajuda a visualizar a forma não truncada de cada coluna.

TruncatedColumnDisplay


4
display.height: obsoleto, use em display.heightvez disso ... Estou em um loop morto.
Frozen Flame

5
Hoje em dia as opções também podem ser definidos como atribuições a atributos depd.options , por exemplopd.options.display.max_rows = 999
unutbu

2
A propriedade 'display.height' foi descontinuada.
Greg M. Krsak

2
Não funcionou para mim no Pandas 0.23.2.
Devinbost # 27/18

6
Você pode usar o option_context para que as alterações da opção sejam locais para o que você está trabalhando. Isso evita a impressão acidental de 400 páginas de lixo eletrônico na sua próxima ligação .head()ou o que for.
Mike Williamson

195

Tente o seguinte:

pd.set_option('display.expand_frame_repr', False)

A partir da documentação:

display.expand_frame_repr: boolean

Seja para imprimir a cópia completa do DataFrame para DataFrames amplos em várias linhas, max_columns ainda é respeitado, mas a saída será agrupada em várias "páginas" se a largura exceder a largura de exibição. [padrão: True] [atualmente: True]

Veja: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.set_option.html


6
Este funciona para mim. Parece que os pandas calculam mal a largura da saída por algum motivo e quebram colunas desnecessariamente.
Zbyszek

5
Eu literalmente tenho que fazer isso todos os dias ... Existe uma maneira de definir isso globalmente em algum lugar?
citynorman

1
@citynorman veja pandas\core\config_init.pypara defini-lo permanentemente.
Jarad 07/07/19

106

Se você deseja definir opções temporariamente para exibir um DataFrame grande, pode usar option_context :

with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print (df)

Os valores das opções são restaurados automaticamente quando você sai do withbloco.


3
Para não definir limites, Nonepode ser usado (em vez de 999, etc.).
Eric O Lebigot

5
with pd.option_context('display.max_rows', None, 'display.max_columns', None): print(energy)não funcionou. Não mudou o número de colunas que eu queria ver. No entanto, a solução da Wouter Overmeiere funcionou.
precisa saber é o seguinte

Mas há diferença, precisa de algum número como -1ou 500não Nenhum.
precisa saber é

2
Usando -1 acidentes, e 500 não faz nada
Aziz Javed

1
+1 por sugerir um gerenciador de contexto, mas -1 pelo max_rowsvalor;). Definir 'display.max_rows'-1 parece atrapalhar completamente a formatação (para os meus dados não há falha, mas agora imprime certas linhas várias vezes).
bluenote10

88

Somente o uso dessas 3 linhas funcionou para mim:

pd.set_option('display.max_columns', None)  
pd.set_option('display.expand_frame_repr', False)
pd.set_option('max_colwidth', -1)

Anaconda / Python 3.6.5 / pandas: 0.23.0 / Código do Visual Studio 1.26


54

Defina a largura máxima da coluna usando:

pd.set_option('max_colwidth', 800)

Esta instrução específica define a largura máxima para 800px, por coluna.


2
Rolando para baixo em ordem decrescente de votos, esta é a primeira resposta que funcionou para que os pandas não truncassem a saída de texto sem formatação dos DataFrames. (pandas 0,22, iTerm2 3.0.13, OS X 10.12).
Peter Leimbigler 19/03/19

2
Este é o único que funcionou para mim no Pandas 0.23.2.
Devinbost # 27/18

1
Como é que você não precisou especificar como display.max_colwidth? É assim que está listado na documentação. Concordo que só max_colwidthfunciona e é mais curto para escrever, mas fiquei surpreso.
Cmo 17/10

26

Você pode usar print df.describe().to_string()para forçá-lo a mostrar a tabela inteira. (Você pode usar to_string()assim para qualquer DataFrame. O resultado describeé apenas um DataFrame em si.)

O 8 é o número de linhas no DataFrame que contém a "descrição" (porque describecalcula 8 estatísticas, min, max, média etc.).


26

Você pode ajustar as opções de impressão dos pandas com set_printoptions.

In [3]: df.describe()
Out[3]: 
<class 'pandas.core.frame.DataFrame'>
Index: 8 entries, count to max
Data columns:
x1    8  non-null values
x2    8  non-null values
x3    8  non-null values
x4    8  non-null values
x5    8  non-null values
x6    8  non-null values
x7    8  non-null values
dtypes: float64(7)

In [4]: pd.set_printoptions(precision=2)

In [5]: df.describe()
Out[5]: 
            x1       x2       x3       x4       x5       x6       x7
count      8.0      8.0      8.0      8.0      8.0      8.0      8.0
mean   69024.5  69025.5  69026.5  69027.5  69028.5  69029.5  69030.5
std       17.1     17.1     17.1     17.1     17.1     17.1     17.1
min    69000.0  69001.0  69002.0  69003.0  69004.0  69005.0  69006.0
25%    69012.2  69013.2  69014.2  69015.2  69016.2  69017.2  69018.2
50%    69024.5  69025.5  69026.5  69027.5  69028.5  69029.5  69030.5
75%    69036.8  69037.8  69038.8  69039.8  69040.8  69041.8  69042.8
max    69049.0  69050.0  69051.0  69052.0  69053.0  69054.0  69055.0

No entanto, isso não funcionará em todos os casos, pois o pandas detecta a largura do console e será usado apenas to_stringse a saída couber no console (consulte a documentação de set_printoptions). Nesse caso, você pode ligar explicitamente to_stringcomo respondido pelo BrenBarn .

Atualizar

Com a versão 0.10, a maneira como os quadros de dados amplos são impressos mudou :

In [3]: df.describe()
Out[3]: 
                 x1            x2            x3            x4            x5  \
count      8.000000      8.000000      8.000000      8.000000      8.000000   
mean   59832.361578  27356.711336  49317.281222  51214.837838  51254.839690   
std    22600.723536  26867.192716  28071.737509  21012.422793  33831.515761   
min    31906.695474   1648.359160     56.378115  16278.322271     43.745574   
25%    45264.625201  12799.540572  41429.628749  40374.273582  29789.643875   
50%    56340.214856  18666.456293  51995.661512  54894.562656  47667.684422   
75%    75587.003417  31375.610322  61069.190523  67811.893435  76014.884048   
max    98136.474782  84544.484627  91743.983895  75154.587156  99012.695717   

                 x6            x7  
count      8.000000      8.000000  
mean   41863.000717  33950.235126  
std    38709.468281  29075.745673  
min     3590.990740   1833.464154  
25%    15145.759625   6879.523949  
50%    22139.243042  33706.029946  
75%    72038.983496  51449.893980  
max    98601.190488  83309.051963  

Além disso, a API para definir as opções de pandas mudou:

In [4]: pd.set_option('display.precision', 2)

In [5]: df.describe()
Out[5]: 
            x1       x2       x3       x4       x5       x6       x7
count      8.0      8.0      8.0      8.0      8.0      8.0      8.0
mean   59832.4  27356.7  49317.3  51214.8  51254.8  41863.0  33950.2
std    22600.7  26867.2  28071.7  21012.4  33831.5  38709.5  29075.7
min    31906.7   1648.4     56.4  16278.3     43.7   3591.0   1833.5
25%    45264.6  12799.5  41429.6  40374.3  29789.6  15145.8   6879.5
50%    56340.2  18666.5  51995.7  54894.6  47667.7  22139.2  33706.0
75%    75587.0  31375.6  61069.2  67811.9  76014.9  72039.0  51449.9
max    98136.5  84544.5  91744.0  75154.6  99012.7  98601.2  83309.1

Prefiro usar o método max_columns mencionado por lodagro, mas fico feliz que você tenha mencionado a palavra-chave precision, pois isso ajudará a limpar as estatísticas exibidas. Obrigado!
beterraba

22

Você pode definir a exibição da saída para corresponder à sua largura atual do terminal:

pd.set_option('display.width', pd.util.terminal.get_terminal_size()[0])

6
@ wouter-overmeire diz que os pandas fazem isso automaticamente , mas isso não parece ser o caso, pelo menos não com 0.18.0. No entanto, se você usar pd.set_option('display.width', None)em um terminal, "os pandas detectarão corretamente a largura" .
Matthias Fripp

Exatamente! Não faz isso por padrão. Configurando-o como None, ele simplesmente ignora a largura. Talvez seja um bug no Pandas ou talvez tenha a ver com o terminal gnome ..? Obrigado Wilfred Hughes!
danger89

3
AttributeError: módulo 'pandas.util' tem nenhum atributo 'terminal'
Bhishan Poudel

1
@BhishanPoudel Você pode fazer isso:pd.options.display.width = None
SebMa

1
@BhishanPoudel Esta resposta tem alguns anos e eu encontrei o mesmo problema que você. Como da escrita deste, usando pandas versão 0.23.1, o módulo é agorapd.io.formats.terminal.get_terminal_size()
Ajay

13

De acordo com a documentação da v0.18.0 , se você estiver rodando em um terminal (por exemplo, não o notebook iPython, qtconsole ou IDLE), é um liner de duas linhas que o Pandas detecte automaticamente a largura da tela e se adapte rapidamente com quantas colunas que mostra:

pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)

1
Isso funcionou para mim, obrigado! Estou usando Pandas 0.22.0 (mais recente a partir de 8 de fevereiro de 2018) usando o built-in aplicativo Terminal no OS X 10.11.6
Greg Sadetsky

8

Parece que todas as respostas acima resolvem o problema. Mais um ponto: em vez de pd.set_option('option_name'), você pode usar o (capacidade de conclusão automática)

pd.options.display.width = None

Consulte o documento do Pandas: Opções e configurações:

As opções têm um nome completo, sem distinção entre maiúsculas e minúsculas (por exemplo display.max_rows). Você pode obter / definir opções diretamente como atributos do atributo de nível superior options:

In [1]: import pandas as pd

In [2]: pd.options.display.max_rows
Out[2]: 15

In [3]: pd.options.display.max_rows = 999

In [4]: pd.options.display.max_rows
Out[4]: 999

[...]

para os max_...parâmetros:

max_rowse max_columnssão usados ​​em __repr__()métodos para decidir se to_string()ou info()é usado para renderizar um objeto em uma string. Caso o python / IPython esteja sendo executado em um terminal, isso pode ser definido como 0 e o pandas detectará corretamente a largura do terminal e trocará para um formato menor, caso todas as colunas não se ajustem verticalmente. O bloco de notas IPython, IPython qtconsole ou IDLE não são executados em um terminal e, portanto, não é possível fazer a detecção automática correta. ' None' valor significa ilimitado. [ênfase não no original]

para o widthparam:

Largura da exibição em caracteres. Caso o python / IPython esteja sendo executado em um terminal, isso pode ser definido como Nonee o pandas detectará a largura corretamente. Observe que o bloco de notas IPython, IPython qtconsole ou IDLE não são executados em um terminal e, portanto, não é possível detectar corretamente a largura.


5
import pandas as pd
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 1000)

SentenceA = "William likes Piano and Piano likes William"
SentenceB = "Sara likes Guitar"
SentenceC = "Mamoosh likes Piano"
SentenceD = "William is a CS Student"
SentenceE = "Sara is kind"
SentenceF = "Mamoosh is kind"


bowA = SentenceA.split(" ")
bowB = SentenceB.split(" ")
bowC = SentenceC.split(" ")
bowD = SentenceD.split(" ")
bowE = SentenceE.split(" ")
bowF = SentenceF.split(" ")

# Creating a set consisted of all words

wordSet = set(bowA).union(set(bowB)).union(set(bowC)).union(set(bowD)).union(set(bowE)).union(set(bowF))
print("Set of all words is: ", wordSet)

# Initiating dictionary with 0 value for all BOWs

wordDictA = dict.fromkeys(wordSet, 0)
wordDictB = dict.fromkeys(wordSet, 0)
wordDictC = dict.fromkeys(wordSet, 0)
wordDictD = dict.fromkeys(wordSet, 0)
wordDictE = dict.fromkeys(wordSet, 0)
wordDictF = dict.fromkeys(wordSet, 0)

for word in bowA:
    wordDictA[word] += 1
for word in bowB:
    wordDictB[word] += 1
for word in bowC:
    wordDictC[word] += 1
for word in bowD:
    wordDictD[word] += 1
for word in bowE:
    wordDictE[word] += 1
for word in bowF:
    wordDictF[word] += 1

# Printing Term frequency

print("SentenceA TF: ", wordDictA)
print("SentenceB TF: ", wordDictB)
print("SentenceC TF: ", wordDictC)
print("SentenceD TF: ", wordDictD)
print("SentenceE TF: ", wordDictE)
print("SentenceF TF: ", wordDictF)

print(pd.DataFrame([wordDictA, wordDictB, wordDictB, wordDictC, wordDictD, wordDictE, wordDictF]))

Resultado:

   CS  Guitar  Mamoosh  Piano  Sara  Student  William  a  and  is  kind  likes
0   0       0        0      2     0        0        2  0    1   0     0      2
1   0       1        0      0     1        0        0  0    0   0     0      1
2   0       1        0      0     1        0        0  0    0   0     0      1
3   0       0        1      1     0        0        0  0    0   0     0      1
4   1       0        0      0     0        1        1  1    0   1     0      0
5   0       0        0      0     1        0        0  0    0   1     1      0
6   0       0        1      0     0        0        0  0    0   1     1      0

Você só precisa destes dois itens: (Verifique o exemplo acima) importar pandas como pd pd.set_option ('display.max_columns', 100) pd.set_option ('display.width', 1000) #
William Pourmajidi

4

Usei essas configurações quando a escala de dados é alta.

# environment settings: 
pd.set_option('display.max_column',None)
pd.set_option('display.max_rows',None)
pd.set_option('display.max_seq_items',None)
pd.set_option('display.max_colwidth', 500)
pd.set_option('expand_frame_repr', True)

Você pode consultar a documentação aqui


4

A linha abaixo é suficiente para exibir todas as colunas do quadro de dados. pd.set_option('display.max_columns', None)


1
Bem-vindo ao SO! Quando você postar uma nova resposta a uma pergunta e houver mais algumas respostas, tente mostrar os Profissionais. Ainda há uma resposta pd.set_option('display.max_columns', 0)Quais são os seus benefícios?
David García Bodego 5/11/19

3

Se você não quiser mexer com suas opções de exibição e apenas quiser ver esta lista específica de colunas sem expandir todos os quadros de dados visualizados, tente:

df.columns.values


2

Você pode simplesmente executar as seguintes etapas,

  • Você pode alterar as opções do recurso max_columns do pandas da seguinte maneira

    import pandas as pd
    pd.options.display.max_columns = 10

    (isso permite que 10 colunas sejam exibidas, você pode alterar isso conforme necessário)

  • Dessa forma, você pode alterar o número de linhas conforme necessário, da seguinte forma (se precisar alterar o máximo de linhas)

    pd.options.display.max_rows = 999

    (isso permite imprimir 999 linhas por vez)

Consulte o documento para alterar diferentes opções / configurações para pandas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.