Comment imprimer des pandas DataFrame sans index

170

Je veux imprimer le dataframe entier, mais je ne veux pas imprimer l'index

En outre, une colonne est de type datetime, je veux juste imprimer l'heure, pas la date.

Le dataframe ressemble à:

   User ID           Enter Time   Activity Number
0      123  2014-07-08 00:09:00              1411
1      123  2014-07-08 00:18:00               893
2      123  2014-07-08 00:49:00              1041

Je veux qu'il soit imprimé comme

User ID   Enter Time   Activity Number
123         00:09:00              1411
123         00:18:00               893
123         00:49:00              1041
lserlohn
la source
1
Vous utilisez une terminologie ("data frame", "index") qui me fait penser que vous travaillez réellement en R, pas en Python. Précisez s'il vous plaît. Quoi qu'il en soit, nous devons voir le code existant qui imprime cette "trame de données" pour avoir la moindre chance de pouvoir aider. Veuillez lire et suivre les instructions sur stackoverflow.com/help/mcve
zwol
... Je dirai que s'il s'agit en fait de Python et que ce sont des datetime.datetimeobjets dans la deuxième colonne, vous pouvez imprimer juste l'heure en utilisant la strftimeméthode, avec une chaîne de format appropriée (probablement "%H:%M:%S").
zwol le
17
@Zack: DataFrameest le nom de la structure de données 2D dans pandas, une bibliothèque d'analyse de données Python populaire.
DSM

Réponses:

217
print df.to_string(index=False)
Pavol Zibrita
la source
9
C'est bien, cependant il ne contient plus l'onglet-sep qui n'est qu'un handicap lors de la copie pour exceller
Rockbar
7
@Rockbar si vous voulez copier / exporter vers Excel, vous devriez df.to_csvquand même l' utiliser .
U2EF1
3
Pour moi, les étiquettes de colonne ne sont pas justifiées par rapport aux données (il manque des espaces au début). Peut-être parce que mes données prennent plus de caractères que l'étiquette de colonne. L'ajout de l'argument justify = 'left' le corrige, bien que change évidemment l'alignement des étiquettes de colonne.
ErnestScribbler
1
Vous pouvez également utiliser df.to_clipboard()et ensuite coller dans Excel. Utile pour traiter le stupide BS de Windows "vous ne pouvez pas éditer un document ouvert".
BallpointBen
df.to_excel('filename.xlsx', index=False)
Sonicsmooth
30
print(df.to_csv(sep='\t', index=False))

Ou peut-être:

print(df.to_csv(columns=['A', 'B', 'C'], sep='\t', index=False))
U2EF1
la source
3
Comment est-ce possible car DataFrame.to_csv n'a pas de valeur de retour? Je n'imprime que Aucun.
jung rhew
En effet, OP a demandé à imprimer. Ce commentaire n'imprime pas le dataframe, mais l'enregistre au format CSV.
Paul le
24

La ligne ci-dessous masquerait la colonne d'index de DataFrame lorsque vous imprimez

df.style.hide_index()
AnarchisteGeek
la source
8
Nécessite le package jinja2 et ne produit pas la sortie souhaitée avec Python 3.7
PeterXX
1
Je trouve que cette réponse est plus efficace à copier / coller dans un tableau lors de la rédaction d'un rapport, merci!
location
8

Si vous souhaitez imprimer correctement les trames de données, vous pouvez utiliser le package tabulate .

import pandas as pd
import numpy as np
from tabulate import tabulate

def pprint_df(dframe):
    print tabulate(dframe, headers='keys', tablefmt='psql', showindex=False)

df = pd.DataFrame({'col1': np.random.randint(0, 100, 10), 
    'col2': np.random.randint(50, 100, 10), 
    'col3': np.random.randint(10, 10000, 10)})

pprint_df(df)

Plus précisément, showindex=Falsecomme son nom l'indique, vous permet de ne pas afficher l'index. La sortie ressemblerait à ceci:

+--------+--------+--------+
|   col1 |   col2 |   col3 |
|--------+--------+--------|
|     15 |     76 |   5175 |
|     30 |     97 |   3331 |
|     34 |     56 |   3513 |
|     50 |     65 |    203 |
|     84 |     75 |   7559 |
|     41 |     82 |    939 |
|     78 |     59 |   4971 |
|     98 |     99 |    167 |
|     81 |     99 |   6527 |
|     17 |     94 |   4267 |
+--------+--------+--------+
roi
la source
8

Pour conserver l'utilisation de "jolis imprimés"

from IPython.display import HTML
HTML(df.to_html(index=False))

entrez la description de l'image ici

Antony Hatchkins
la source
4

Si vous voulez juste une chaîne / json à imprimer, cela peut être résolu avec:

print(df.to_string(index=False))

Buf si vous souhaitez sérialiser les données aussi ou même envoyer à un MongoDB, il serait préférable de faire quelque chose comme:

document = df.to_dict(orient='list')

Il existe maintenant 6 façons d'orienter les données, vérifiez plus dans la documentation panda qui vous convient le mieux.

Ziul
la source
4

Pour répondre à la question «Comment imprimer un dataframe sans index», vous pouvez définir l'index comme un tableau de chaînes vides (une pour chaque ligne du dataframe), comme ceci:

blankIndex=[''] * len(df)
df.index=blankIndex

Si nous utilisons les données de votre publication:

row1 = (123, '2014-07-08 00:09:00', 1411)
row2 = (123, '2014-07-08 00:49:00', 1041)
row3 = (123, '2014-07-08 00:09:00', 1411)
data = [row1, row2, row3]
#set up dataframe
df = pd.DataFrame(data, columns=('User ID', 'Enter Time', 'Activity Number'))
print(df)

qui serait normalement imprimé comme:

   User ID           Enter Time  Activity Number
0      123  2014-07-08 00:09:00             1411
1      123  2014-07-08 00:49:00             1041
2      123  2014-07-08 00:09:00             1411

En créant un tableau avec autant de chaînes vides qu'il y a de lignes dans le bloc de données:

blankIndex=[''] * len(df)
df.index=blankIndex
print(df)

Cela supprimera l'index de la sortie:

  User ID           Enter Time  Activity Number
      123  2014-07-08 00:09:00             1411
      123  2014-07-08 00:49:00             1041
      123  2014-07-08 00:09:00             1411

Et dans Jupyter Notebooks serait rendu comme sur cette capture d'écran: Dataframe Juptyer Notebooks sans colonne d'index

roj
la source
En dépit d'être un peu bizarre, c'est la meilleure solution ici IMO.
Corel
0

Semblable à de nombreuses réponses ci-dessus qui utilisent df.to_string (index = False), je trouve souvent nécessaire d'extraire une seule colonne de valeurs, auquel cas vous pouvez spécifier une colonne individuelle avec .to_string en utilisant ce qui suit:

data = pd.DataFrame({'col1': np.random.randint(0, 100, 10), 
    'col2': np.random.randint(50, 100, 10), 
    'col3': np.random.randint(10, 10000, 10)})

print(data.to_string(columns=['col1'], index=False)

print(data.to_string(columns=['col1', 'col2'], index=False))

Ce qui fournit une sortie facile à copier (et sans indexation) pour une utilisation en collant ailleurs (Excel). Exemple de sortie:

col1  col2    
49    62    
97    97    
87    94    
85    61    
18    55
BigTom
la source