2016-01-27 11 views
2

У меня есть DataFrame с именами строк и столбцов индексов:Как сохранить имя строк и индекс столбца в pandas DataFrame?

import numpy as np 
import pandas as pd 

I = pd.Index(["a", "b", "c", "d"], name="rows") 
C = pd.Index(["col0", "col1", "col2"], name="cols") 
df = pd.DataFrame(data=np.random.rand(4, 3), 
        index=I, 
        columns=C) 

Я пытался сохранить его в нескольких форматах (Excel, CSV), но при повторном чтении файла, имена теряются (возможно, Я пропустил некоторые варианты). Msgpack работает, но он отмечен как экспериментальный, поэтому я бы предпочел избежать его пока. Я также предпочел бы избежать pickle. Есть ли способ (формат и опция) для хранения имени двух индексов?

EDIT: Я знаю, как писать и читать CSV с помощью панд. Проблема заключается в сохранении имени индекса столбца и индекса строки.

+0

Первая версия кода была неправильной (имена не сохранились). Простите за это. –

+0

Доступ и экспорт имен индекса и столбцов не является проблемой вообще. Тем не менее, я думаю о правильном способе импорта экспортированных данных, поскольку это имеет смысл при использовании только нескольких индексов. Но вам не нужно использовать мультииндекс для правильного доступа к вашим данным. – albert

ответ

2

Вы можете использовать HDF.

import numpy as np 
import pandas as pd 
I = pd.Index(["a", "b", "c", "d"], name="rows") 
C = pd.Index(["col0", "col1", "col2"], name="columns") 
df = pd.DataFrame(data=np.random.rand(4,3), index=I, columns=C) 
print(df) 

columns  col0  col1  col2 
rows         
a  0.098497 0.918954 0.642800 
b  0.168266 0.678434 0.455059 
c  0.434939 0.244027 0.599400 
d  0.877356 0.053085 0.182661 

df.to_hdf('test.hdf', 'test') 
print(pd.read_hdf('test.hdf')) 

columns  col0  col1  col2 
rows         
a  0.098497 0.918954 0.642800 
b  0.168266 0.678434 0.455059 
c  0.434939 0.244027 0.599400 
d  0.877356 0.053085 0.182661 
+0

Кажется, идеальное предложение! –

0

header=True (для имен столбцов) и index=True (для значений индекса) в df.to_csv должен делать трюк. Оба по умолчанию равны True, говорят документы. Однако вам придется вручную установить индекс после загрузки, он будет загружен как обычный столбец. Для этого я добавил имя индекса:

import numpy as np 
import pandas as pd 

# your code: 
I = pd.Index(["a", "b", "c", "d"], "rows") 
C = pd.Index(["col0", "col1", "col2"], "cols") 
df = pd.DataFrame(data=np.random.rand(4, 3), 
        index=I, 
        columns=C) 

# name the index 
I.name = 'index' 

print "original:" 
print df 
print "" 

df.to_csv("~/test.csv", index=True, header=True) 

df2 = pd.read_csv("~/test.csv").set_index('index') 

print "read from disk:" 
print df2 
print "" 

Выход:

original: 
      col0  col1  col2 
index        
a  0.455378 0.830872 0.495953 
b  0.707146 0.832009 0.112540 
c  0.894997 0.156364 0.521047 
d  0.775462 0.482554 0.578177 

read from disk: 
      col0  col1  col2 
index        
a  0.455378 0.830872 0.495953 
b  0.707146 0.832009 0.112540 
c  0.894997 0.156364 0.521047 
d  0.775462 0.482554 0.578177 
+0

В моем коде содержалась ошибка (извините за это): имена, где они не установлены правильно. Проблема заключается в том, как сохранить имя индекса строк и имя индекса столбца. –

2

Вы можете экспортировать DataFrame в CSV-файл с помощью .to_csv() и читать его обратно при помощи .read_csv(). Я продлил код, который вы уже следующим образом:

#!/usr/bin/env python3 
# coding: utf-8 

import numpy as np 
import pandas as pd 

I = pd.Index(["a", "b", "c", "d"], "rows") 
C = pd.Index(["col0", "col1", "col2"], "cols") 
df = pd.DataFrame(data=np.random.rand(4,3), index=I, columns=C) 

# export DataFrame to csv 
df.to_csv('out.csv') 

# set index_col in order to read first column as indices 
df_in = pd.read_csv('out.csv', index_col=0) 

Так DataFrame df выглядит следующим образом:

 col0  col1  col2 
a 0.590016 0.834033 0.535310 
b 0.421589 0.897302 0.029500 
c 0.373580 0.109005 0.239181 
d 0.473872 0.075918 0.751628 

в формате CSV файл out.csv выглядит следующим образом:

,col0,col1,col2 
a,0.5900160748408918,0.8340332218911729,0.5353103406507513 
b,0.42158899389955884,0.8973015040807538,0.029500416731096046 
c,0.37357951184145965,0.10900495955642386,0.2391805787788026 
d,0.47387186813644167,0.07591794371425187,0.7516279365972057 

Чтение данные обратно в DataFrame df_in следующим образом:

 col0  col1  col2 
a 0.590016 0.834033 0.535310 
b 0.421589 0.897302 0.029500 
c 0.373580 0.109005 0.239181 
d 0.473872 0.075918 0.751628 

Таким образом, df2 точно такой же, как df, который показывает, что экспорт и требуемый импорт работают должным образом.

EDIT для экспорта столбцов и индексов имен:

df.to_csv('out.csv', index_label=[df.index.name, df.columns.name]) 

Однако это делает повторное импортирование немного трудно, так как название колонки добавляются в качестве дополнительного столбца. Обычно это полезно для данных с несколькими индексами, но приводит к дополнительному пустому столбцу.

Так что я хотел бы предложить, чтобы экспортировать имя индекса, только:

# export DataFrame to csv 
df.to_csv('out.csv', index_label=df.index.name) 

# set index_col in order to read first column as indices 
df_in = pd.read_csv('out.csv', index_col=0) 

, что приводит к df_in как:

  col0  col1  col2 
rows        
a  0.442467 0.959260 0.626502 
b  0.639044 0.989795 0.853002 
c  0.576137 0.350260 0.532920 
d  0.235698 0.095978 0.194151 

Я не знаю, почему вам нужно экспортировать имена как индекс и colums.Если вы просто хотите получить доступ имен строк или столбцов вы можете получить их этикетку, как это:

column_labels = df.columns.get_values() 
>>> array(['col0', 'col1', 'col2'], dtype=object) 

index_labels = df.index.get_values() 
>>> array(['a', 'b', 'c', 'd'], dtype=object) 
+0

В моем коде содержалась ошибка (извините за это): имена, где они не установлены правильно. Я знаю, как сохранить в CSV. Проблема заключается в том, чтобы сохранить имена индекса. В вашем коде индекс столбца 'df_in' не будет установлен. –

+0

Я также попытался сыграть 'index_label', но безуспешно (как вы упомянули, трудно перечитать). Я не думаю, что файлы CSV могут обрабатывать это правильно. Я надеялся, что Excel будет работать, но насколько я знаю, это не так. –

+0

Для чего нужны имена? – albert

1

ли ваш DataFrame здесь на самом деле есть имя индекса? На моем компьютере мне нужно написать

I = pd.Index(["a", "b", "c", "d"], name="rows") 

вместо

I = pd.Index(["a", "b", "c", "d"], "rows") 

для имени, которое будет фактически назначено. Затем, используя df.to_csv() и pd.read_csv(), имя индекса сохраняется (в csv имя индекса просто сохраняется как другой столбец).

Если это не сработает, вам нужно открыть его с помощью программ, отличных от Python? Если нет, то вы могли бы использовать рассол, который должен покинуть объект нетронутый:

import pickle 

pickle.dump(df, open("File.pickled", "wb")) 

df_read = pickle.load(open("File.pickled", "rb")) 

EDIT: Если вы хотите, чтобы имя индекса столбцов должны быть сохранены с to_csv(), а вы могли бы сделать следующий хак:

сохранить его с (преобразует индекс столбцов в строке, следовательно, установив его столбца имя индекса в качестве значения индекса строки)

df.T.reset_index().T.to_csv("DataFrame.csv") 

, а затем прочитать его с любой из этих двух, первый из которых (очень) немного быстрее:

df_read = pd.read_csv("DataFrame.csv", index_col=0) 
df_read.columns = df_read.loc['cols'] 
df_read = df_read.drop('cols', axis=0) 

или

df_read = pd.read_csv("DataFrame.csv", index_col=0) 
df_read = df_read.T.set_index('cols').T 
+0

Упс! Просто понял, что ... Спасибо, я исправлю вопрос. Однако проблема заключается в том, что у вас есть имя для столбцов и строк. –

+0

Хм, я бы тоже предпочел избежать «маринования». –

+0

@MathieuDubois Использование pickle будет сохранять имя столбцов и строк, но если вы хотите избежать этого, вы можете установить индекс столбцов как строку перед сохранением в CSV. Я обновил свой ответ с помощью соответствующего кода. – Borja

Смежные вопросы