2013-08-17 25 views
13

Come posso eliminare o disabilitare gli indici in un frame di dati panda?disable index pandas data frame

Sto imparando i panda dal libro "python per l'analisi dei dati" e so già che posso usare il dataframe.drop per eliminare una colonna o una riga. Ma non ho trovato nulla sulla disabilitazione di tutti gli indici in atto.

risposta

10

df.values fornisce il NumPy originale ndarray senza gli indici.

>>> df 
    x y 
0 4 GE 
1 1 RE 
2 1 AE 
3 4 CD 
>>> df.values 
array([[4, 'GE'], 
     [1, 'RE'], 
     [1, 'AE'], 
     [4, 'CD']], dtype=object) 

Non si può avere un dataframe senza gli indici, che sono il punto di tutta la dataframe :)

Ma tanto per essere chiari, questa operazione non è inplace:

>>> df.values is df.values 
False 

DataFrame mantiene i dati in array bidimensionali raggruppati per tipo, quindi quando si desidera l'intero frame dati dovrà trovare l'LCD di tutti i tipi e costruire un array 2D di quel tipo.

Per istanziare un nuovo frame di dati con i valori da quello vecchio, basta passare il vecchio dataframe alla costruzione new quelli senza dati saranno copiate le stesse strutture dati saranno riutilizzati:

>>> df1 = pd.DataFrame([[1, 2], [3, 4]]) 
>>> df2 = pd.DataFrame(df1) 
>>> df2.iloc[0,0] = 42 
>>> df1 
    0 1 
0 42 2 
1 3 4 

Ma è possibile specificare in modo esplicito il parametro copy:

>>> df1 = pd.DataFrame([[1, 2], [3, 4]]) 
>>> df2 = pd.DataFrame(df1, copy=True) 
>>> df2.iloc[0,0] = 42 
>>> df1 
    0 1 
0 1 2 
1 3 4 
+0

Grazie. Quello che ho fatto è iniziare un nuovo dataframe con i valori del vecchio dataframe. – GeauxEric

+1

Aggiornamento della risposta. –

+0

Penso che quello che voglio veramente sia scrivere i dati in un file senza gli indici, e questo può essere fatto facilmente impostando index = False. Scusa, non ho chiarito la mia domanda in primo luogo. La tua risposta è molto intuitiva. – GeauxEric

0

ho una funzione che può aiutare un po '. Combino file csv con un'intestazione nel seguente modo in python:

def combine_csvs(filedict, combined_file): 
     files = filedict['files'] 
     df = pd.read_csv(files[0]) 
     for file in files[1:]: 
      df = pd.concat([df, pd.read_csv(file)]) 
     df.to_csv(combined_file, index=False) 
     return df 

Può richiedere tutti i file necessari. Chiama questo come:

combine_csvs(dict(files=["file1.csv","file2.csv", "file3.csv"]), 'output.csv') 

Oppure, se si sta leggendo il dataframe in Python come:

df = combine_csvs(dict(files=["file1.csv","file2.csv"]), 'output.csv') 

Il combine_csvs fucntion non salva gli indici. Se hai bisogno degli indici usa invece 'index = True'.

0
d.index = range(len(d)) 

fa un reset semplice indice sul posto - cioè rimuove tutti gli indici esistenti, e aggiunge un numero intero di base uno, che è di tipo indice più elementare un pandi dataframe può avere.

1

Stavo riscontrando un problema simile nel tentativo di acquisire un DataFrame da un CSV senza indici e di scriverlo su un altro file.

mi si avvicinò con il seguente:

import pandas as pd 
import os 

def csv_to_df(csv_filepath): 
    # the read_table method allows you to set an index_col to False, from_csv does not 
    dataframe_conversion = pd.io.parsers.read_table(csv_filepath, sep='\t', header=0, index_col=False) 
    return dataframe_conversion 

def df_to_excel(df): 
    from pandas import ExcelWriter 
    # Get the path and filename w/out extension 
    file_name = 'foo.xlsx' 
    # Add the above w/ .xslx 
    file_path = os.path.join('some/directory/', file_name) 
    # Write the file out 
    writer = ExcelWriter(file_path) 
    # index_label + index are set to `False` so that all the data starts on row 
    # index 1 and column labels (called headers by pandas) are all on row index 0. 
    df.to_excel(writer, 'Attributions Detail', index_label=False, index=False, header=True) 
    writer.save() 
0

Inoltre, se si utilizza la funzione df.to_excel di un pd.ExcelWriter, che è dove è scritto in un foglio di lavoro Excel, è possibile specificare index=False nei tuoi parametri di là .

creare l'autore di Excel:

writer = pd.ExcelWriter(type_box + '-rules_output-' + date_string + '.xlsx',engine='xlsxwriter') 

Abbiamo una lista denominata lines:

# create a dataframe called 'df' 
df = pd.DataFrame([sub.split(",") for sub in lines], columns=["Rule", "Device", "Status"])) 

#convert df to Excel worksheet 
df.to_excel(writer, sheet_name='all_status',**index=False**) 
writer.save() 
Problemi correlati