Comment puis-je étendre l'affichage de sortie pour voir plus de colonnes d'un DataFrame pandas ?
-
13-12-2019 - |
Question
Existe-t-il un moyen d'élargir l'affichage de la sortie en mode interactif ou en mode d'exécution de script ?
Plus précisément, j'utilise le describe()
fonctionner sur un pandas DataFrame
.Quand le DataFrame
fait 5 colonnes (étiquettes) de large, j'obtiens les statistiques descriptives que je souhaite.Cependant, si le DataFrame
n'a plus de colonnes, les statistiques sont supprimées et quelque chose comme ceci est renvoyé :
>> 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
La valeur "8" est donnée qu'il y ait 6 ou 7 colonnes.A quoi fait référence le « 8 » ?
J'ai déjà essayé d'agrandir la fenêtre IDLE et d'augmenter les options de largeur "Configurer IDLE", en vain.
Mon but en utilisant des pandas et describe()
est d'éviter d'utiliser un deuxième programme comme Stata pour effectuer des manipulations et des enquêtes de base sur les données.
La solution
Mise à jour:Pandas à partir de la version 0.23.4
Ce n'est pas nécessaire, pandas détecte automatiquement la taille de la fenêtre de votre terminal si vous définissez pd.options.display.width = 0
.(Pour les anciennes versions, voir en bas.)
pandas.set_printoptions(...)
est obsolète.Utilisez plutôt pandas.set_option(optname, val)
, ou équivalent pd.options.<opt.hierarchical.name> = val
.Comme:
import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
Voici la de l'aide pour set_option
:
set_option(pat,value) - Sets the value of the specified option Available options: display.[chop_threshold, colheader_justify, column_space, date_dayfirst, date_yearfirst, encoding, 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, precision, width] mode.[sim_interactive, use_inf_as_null] Parameters ---------- pat - str/regexp which should match a single option. Note: partial matches are supported for convenience, but unless you use the full option name (e.g. x.y.z.option_name), your code may break in future versions if new options with similar names are introduced. value - new value of option. Returns ------- None Raises ------ KeyError if no such option exists display.chop_threshold: [default: None] [currently: None] : float or None if set to a float value, all float values smaller then the given threshold will be displayed as exactly 0 by repr and friends. display.colheader_justify: [default: right] [currently: right] : 'left'/'right' Controls the justification of column headers. used by DataFrameFormatter. display.column_space: [default: 12] [currently: 12]No description available. display.date_dayfirst: [default: False] [currently: False] : boolean When True, prints and parses dates with the day first, eg 20/01/2005 display.date_yearfirst: [default: False] [currently: False] : boolean When True, prints and parses dates with the year first, eg 2005/01/20 display.encoding: [default: UTF-8] [currently: UTF-8] : str/unicode Defaults to the detected encoding of the console. Specifies the encoding to be used for strings returned by to_string, these are generally strings meant to be displayed on the console. display.expand_frame_repr: [default: True] [currently: True] : boolean Whether to print out the full DataFrame repr for wide DataFrames across multiple lines, `max_columns` is still respected, but the output will wrap-around across multiple "pages" if it's width exceeds `display.width`. display.float_format: [default: None] [currently: None] : callable The callable should accept a floating point number and return a string with the desired format of the number. This is used in some places like SeriesFormatter. See core.format.EngFormatter for an example. display.height: [default: 60] [currently: 1000] : int Deprecated. (Deprecated, use `display.height` instead.) display.line_width: [default: 80] [currently: 1000] : int Deprecated. (Deprecated, use `display.width` instead.) display.max_columns: [default: 20] [currently: 500] : int max_rows and max_columns are used in __repr__() methods to decide if to_string() or info() is used to render an object to a string. In case python/IPython is running in a terminal this can be set to 0 and pandas will correctly auto-detect the width the terminal and swap to a smaller format in case all columns would not fit vertically. The IPython notebook, IPython qtconsole, or IDLE do not run in a terminal and hence it is not possible to do correct auto-detection. 'None' value means unlimited. display.max_colwidth: [default: 50] [currently: 50] : int The maximum width in characters of a column in the repr of a pandas data structure. When the column overflows, a "..." placeholder is embedded in the output. display.max_info_columns: [default: 100] [currently: 100] : int max_info_columns is used in DataFrame.info method to decide if per column information will be printed. display.max_info_rows: [default: 1690785] [currently: 1690785] : int or None max_info_rows is the maximum number of rows for which a frame will perform a null check on its columns when repr'ing To a console. The default is 1,000,000 rows. So, if a DataFrame has more 1,000,000 rows there will be no null check performed on the columns and thus the representation will take much less time to display in an interactive session. A value of None means always perform a null check when repr'ing. display.max_rows: [default: 60] [currently: 500] : int This sets the maximum number of rows pandas should output when printing out various output. For example, this value determines whether the repr() for a dataframe prints out fully or just a summary repr. 'None' value means unlimited. display.max_seq_items: [default: None] [currently: None] : int or None when pretty-printing a long sequence, no more then `max_seq_items` will be printed. If items are ommitted, they will be denoted by the addition of "..." to the resulting string. If set to None, the number of items to be printed is unlimited. display.mpl_style: [default: None] [currently: None] : bool Setting this to 'default' will modify the rcParams used by matplotlib to give plots a more pleasing visual style by default. Setting this to None/False restores the values to their initial value. display.multi_sparse: [default: True] [currently: True] : boolean "sparsify" MultiIndex display (don't display repeated elements in outer levels within groups) display.notebook_repr_html: [default: True] [currently: True] : boolean When True, IPython notebook will use html representation for pandas objects (if it is available). display.pprint_nest_depth: [default: 3] [currently: 3] : int Controls the number of nested levels to process when pretty-printing display.precision: [default: 7] [currently: 7] : int Floating point output precision (number of significant digits). This is only a suggestion display.width: [default: 80] [currently: 1000] : int Width of the display in characters. In case python/IPython is running in a terminal this can be set to None and pandas will correctly auto-detect the width. Note that the IPython notebook, IPython qtconsole, or IDLE do not run in a terminal and hence it is not possible to correctly detect the width. mode.sim_interactive: [default: False] [currently: False] : boolean Whether to simulate interactive mode for purposes of testing mode.use_inf_as_null: [default: False] [currently: False] : boolean True means treat None, NaN, INF, -INF as null (old way), False means None and NaN are null, but INF, -INF are not null (new way). Call def: pd.set_option(self, *args, **kwds)
MODIFIER:informations sur les anciennes versions, dont une grande partie est obsolète.
Comme @bmu mentionné, pandas détecte automatiquement (par défaut) la taille de la zone d'affichage, une vue récapitulative sera utilisée lorsqu'une représentation d'objet ne tient pas sur l'écran.Vous avez mentionné le redimensionnement de la fenêtre IDLE, sans effet.Si tu fais print df.describe().to_string()
Est-ce que ça rentre sur la fenêtre IDLE ?
La taille du terminal est déterminée par pandas.util.terminal.get_terminal_size()
(obsolète et supprimé), cela renvoie un tuple contenant le (width, height)
de l’affichage.La sortie correspond-elle à la taille de votre fenêtre IDLE ?Il peut y avoir un problème (il y en avait un auparavant lors de l'exécution d'un terminal dans emacs).
Notez qu'il est possible de contourner la détection automatique, pandas.set_printoptions(max_rows=200, max_columns=10)
ne passera jamais à la vue récapitulative si le nombre de lignes et de colonnes ne dépasse pas les limites données.
L'option 'max_colwidth' permet de voir la forme non tronquée de chaque colonne.
Autres conseils
Essaye ça:
pd.set_option('display.expand_frame_repr', False)
À partir de la documentation :
display.expand_frame_repr :booléen
Qu'il s'agisse d'imprimer la représentation complète du DataFrame pour les DataFrames larges sur plusieurs lignes, max_columns est toujours respecté, mais la sortie s'enroulera sur plusieurs « pages » si sa largeur dépasse display.width.[défaut:Vrai] [actuellement :Vrai]
Voir: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.set_option.html
Si vous souhaitez définir temporairement des options pour afficher un grand DataFrame, vous pouvez utiliser option_context:
with pd.option_context('display.max_rows', -1, 'display.max_columns', 5):
print df
Les valeurs des options sont restaurées automatiquement lorsque vous quittez le with
bloc.
Seule l'utilisation de ces 3 lignes a fonctionné pour moi :
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 / Visual Studio Code 1.26
Définissez la largeur maximale de la colonne en utilisant :
pd.set_option('max_colwidth', 800)
Cette instruction particulière définit la largeur maximale à 800 px par colonne.
Vous pouvez ajuster les options d'impression des pandas avec 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
Cependant, cela ne fonctionnera pas dans tous les cas car pandas détecte la largeur de votre console et n'utilisera que to_string
si la sortie tient dans la console (voir la docstring de set_printoptions
).Dans ce cas, vous pouvez appeler explicitement to_string
comme répondu par BrenBarn.
Mise à jour
Avec la version 0.10, la façon dont les trames de données larges sont imprimées modifié:
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
De plus, l'API permettant de définir les options des pandas a été modifiée :
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
Vous pouvez utiliser print df.describe().to_string()
pour le forcer à afficher la table entière.(Vous pouvez utiliser to_string()
comme ça pour n'importe quel DataFrame.Le résultat de describe
n'est qu'un DataFrame lui-même.)
Le 8 est le nombre de lignes du DataFrame contenant la "description" (car describe
calcule 8 statistiques, min, max, moyenne, etc.).
Vous pouvez définir l’affichage de sortie pour qu’il corresponde à la largeur actuelle de votre terminal :
pd.set_option('display.width', pd.util.terminal.get_terminal_size()[0])
Selon le documentation pour la v0.18.0, si vous utilisez un terminal (c'est-à-dire pas un notebook iPython, qtconsole ou IDLE), il suffit de deux lignes pour que Pandas détecte automatiquement la largeur de votre écran et s'adapte à la volée au nombre de colonnes qu'il affiche :
pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)
Il semble que toutes les réponses ci-dessus résolvent le problème.Encore un point :au lieu de pd.set_option('option_name')
, vous pouvez utiliser le (auto-complete-able)
pd.options.display.width = None
Voir Doc Pandas :Options et paramètres :
Les options ont un nom complet en « pointillé », insensible à la casse (par ex.
display.max_rows
).Vous pouvez obtenir / définir des options directement comme attributs du niveau supérieuroptions
attribut: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
[...]
pour le max_...
paramètres :
max_rows
etmax_columns
sont utilisés dans__repr__()
méthodes pour décider sito_string()
ouinfo()
est utilisé pour restituer un objet sous forme de chaîne.Dans le cas où python/IPython est exécuté dans un terminal, cela peut être défini sur 0 et les pandas détecteront automatiquement la largeur du terminal et passeront à un format plus petit au cas où toutes les colonnes ne tiendraient pas verticalement.Le notebook IPython, IPython qtconsole ou IDLE ne s'exécutent pas dans un terminal et il n'est donc pas possible d'effectuer une détection automatique correcte. ‘None
La valeur signifie illimitée. [souligné dans l'original]
pour le width
paramètre :
Largeur de l'affichage en caractères.Si python/IPython est exécuté dans un terminal, cela peut être défini sur
None
et les pandas détecteront correctement automatiquement la largeur.Notez que le notebook IPython, IPython qtconsole ou IDLE ne s'exécutent pas dans un terminal et qu'il n'est donc pas possible de détecter correctement la largeur.
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]))
Sortir:
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
J'ai utilisé ces paramètres lorsque l'échelle des données est élevée.
# 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)
Vous pouvez consulter la documentationici
Si vous ne voulez pas modifier vos options d'affichage et que vous souhaitez simplement voir cette liste particulière de colonnes sans étendre chaque trame de données que vous affichez, vous pouvez essayer :
df.columns.values
Vous pouvez également essayer en boucle :
for col in df.columns:
print(col)
La ligne ci-dessous suffit pour afficher toutes les colonnes du dataframe. pd.set_option('display.max_columns', None)
Vous pouvez simplement suivre les étapes suivantes,
Vous pouvez modifier les options de la fonctionnalité pandas max_columns comme suit
import pandas as pd pd.options.display.max_columns = 10
(cela permet d'afficher 10 colonnes, vous pouvez modifier cela selon vos besoins)
Comme ça, vous pouvez modifier le nombre de lignes dont vous avez besoin pour afficher comme suit (si vous devez également modifier le nombre maximum de lignes)
pd.options.display.max_rows = 999
(cela permet d'imprimer 999 lignes à la fois)
Veuillez vous référer au doc pour modifier différentes options/paramètres pour les pandas