Come stampare Panda DataFrame senza indice


170

Voglio stampare l'intero frame di dati, ma non voglio stampare l'indice

Inoltre, una colonna è di tipo datetime, voglio solo stampare l'ora, non la data.

Il frame di dati si presenta come:

   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

Lo voglio stampare come

User ID   Enter Time   Activity Number
123         00:09:00              1411
123         00:18:00               893
123         00:49:00              1041

1
Stai usando una terminologia ("frame di dati", "indice") che mi fa pensare che stai effettivamente lavorando in R, non in Python. Si prega di precisare. Indipendentemente da ciò, abbiamo bisogno di vedere il codice esistente che stampa questo "frame di dati" per avere qualche possibilità di poter aiutare. Si prega di leggere e seguire le istruzioni a stackoverflow.com/help/mcve
Zwol

... Dirò che se questo è in realtà Python e quelli sono datetime.datetimeoggetti nella seconda colonna, allora puoi stampare solo il tempo usando il strftimemetodo, con una stringa di formato appropriata (probabilmente "%H:%M:%S").
zwol,

17
@Zack: DataFrameè il nome della struttura di dati 2D in pandas, una popolare libreria di analisi dei dati Python.
DSM,

Risposte:


217
print df.to_string(index=False)

9
Questo è carino, tuttavia non contiene più il tab-sep che è un handicap quando si copia per eccellere
Rockbar

7
@Rockbar se vuoi copiare / esportare per eccellere dovresti df.to_csvcomunque utilizzare .
U2EF1

3
Per me le etichette delle colonne risultano non giustificate ai dati (mancano degli spazi all'inizio). Forse perché i miei dati occupano più caratteri dell'etichetta della colonna. L'aggiunta dell'argomento justify = 'left' lo risolve, sebbene ovviamente cambi l'allineamento delle etichette delle colonne.
ErnestScribbler,

1
Puoi anche usare df.to_clipboard()e quindi incollare in Excel. Utile per gestire lo stupido Windows "non puoi modificare un documento aperto" BS.
BallpointBen,

df.to_excel('filename.xlsx', index=False)
Sonicsmooth

30
print(df.to_csv(sep='\t', index=False))

O forse:

print(df.to_csv(columns=['A', 'B', 'C'], sep='\t', index=False))

3
Come è possibile poiché DataFrame.to_csv non ha un valore di ritorno? Ottengo solo Nessuno stampato.
jung rhew,

Infatti, OP ha chiesto di stampare. Questo commento non stampa il frame di dati, ma lo salva in CSV.
Paul,

24

La riga seguente nasconderebbe la colonna dell'indice di DataFrame durante la stampa

df.style.hide_index()

8
Richiede il pacchetto jinja2 e non produce l'output desiderato con Python 3.7
PeterXX

1
Trovo che questa risposta sia più efficace per copiare / incollare in una tabella quando si effettua una segnalazione, grazie!
Leas

8

Se si desidera stampare piuttosto i frame di dati, è possibile utilizzare il pacchetto 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)

Nello specifico, showindex=Falsecome dice il nome, ti permette di non mostrare l'indice. L'output sarebbe simile al seguente:

+--------+--------+--------+
|   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 |
+--------+--------+--------+

8

Per conservare l'uso "pretty-print"

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

inserisci qui la descrizione dell'immagine


4

Se vuoi solo stampare una stringa / json, puoi risolverlo con:

print(df.to_string(index=False))

Se vuoi anche serializzare i dati o addirittura inviarli a MongoDB, sarebbe meglio fare qualcosa del tipo:

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

Ormai ci sono 6 modi per orientare i dati, controllare di più nei documenti panda che si adattano meglio a te.


4

Per rispondere alla domanda "Come stampare un frame di dati senza un indice", è possibile impostare l'indice come un array di stringhe vuote (una per ogni riga nel frame di dati), in questo modo:

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

Se utilizziamo i dati del tuo post:

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)

che normalmente verrebbe stampato come:

   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

Creando un array con tante stringhe vuote quante sono le righe nel frame di dati:

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

Rimuoverà l'indice dall'output:

  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

E nei quaderni Jupyter verrebbe eseguito il rendering in base a questo screenshot: frame di dati per notebook Juptyer senza colonna di indice


Nonostante sia un po 'strano, questa è la soluzione migliore qui IMO.
Corel,

0

Simile a molte delle risposte precedenti che usano df.to_string (indice = Falso), trovo spesso necessario estrarre una singola colonna di valori, nel qual caso puoi specificare una singola colonna con .to_string usando quanto segue:

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))

Che fornisce un output facile da copiare (e indicizzato) per l'uso incollare altrove (Excel). Uscita campione:

col1  col2    
49    62    
97    97    
87    94    
85    61    
18    55
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.