2013-06-27 10 views
2

Я использую to_csv для записи данных DataFrame в файлы csv. Файл CSV имеет один столбец, который содержит multiindexes в кортежах, как:Pandas - писать строки Multiindex с to_csv

('a', 'x') 
('a', 'y') 
('a', 'z') 
('b', 'x') 
('b', 'y') 
('b', 'z') 

Однако, я хочу, чтобы иметь возможность вывода мультииндексных двух столбцов вместо одного столбца кортежей, таких как:

a, x 
, y 
, z 
b, x 
, y 
, z 

Похоже, что tupleize_cols может достичь этого для столбцов, но для строк нет такой опции. Есть ли способ достичь этого?

+1

'' tupleize_cols'' - для мультииндекса по столбцам (его значение в 0.12); просто _ 'reset_index(). set_index (['idxa', 'idxb']). to_csv()' 'ваш лучший выбор (укажите' 'index_col = ['idxa', 'idxb']' 'on read -back – Jeff

+0

Я поставил ответ, чтобы лучше объяснить – Jeff

ответ

3

Я думаю, что это будет делать это

In [3]: df = DataFrame(dict(A = 'foo', B = 'bar', value = 1),index=range(5)).set_index(['A','B']) 

In [4]: df 
Out[4]: 
     value 
A B   
foo bar  1 
    bar  1 
    bar  1 
    bar  1 
    bar  1 

In [5]: df.to_csv('test.csv') 

In [6]: !cat test.csv 
A,B,value 
foo,bar,1 
foo,bar,1 
foo,bar,1 
foo,bar,1 
foo,bar,1 

In [7]: pd.read_csv('test.csv',index_col=[0,1]) 
Out[7]: 
     value 
A B   
foo bar  1 
    bar  1 
    bar  1 
    bar  1 
    bar  1 

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

In [27]: x = df.reset_index() 

In [28]: mask = df.index.to_series().duplicated() 

In [29]: mask 
Out[29]:  
A    B   
foo  bar    False 
     bar     True 
     bar     True 
     bar     True 
     bar     True 
dtype: bool 

In [30]: x.loc[mask.values,['A','B']] = '' 

In [31]: x 
Out[31]:  
     A    B  value 
0  foo  bar      1 
1                1 
2                1 
3                1 
4                1 

In [32]: x.to_csv('test.csv') 

In [33]: !cat test.csv 
,A,B,value 
0,foo,bar,1 
1,,,1 
2,,,1 
3,,,1 
4,,,1 

Читать обратно немного сложно на самом деле

In [37]: pd.read_csv('test.csv',index_col=0).ffill().set_index(['A','B']) 
Out[37]: 
     value 
A B   
foo bar  1 
    bar  1 
    bar  1 
    bar  1 
    bar  1 
+0

Простите, может быть, я не объяснил четко. Надеюсь, что удастся удалить повторяющиеся записи в файле csv. В вашем примере я надеюсь, что появится только «foo» один раз в csv-файле, так что, когда вы будете cat test.csv, вы увидите одно «foo» в первой строке и пустое в последующих строках. – ezbentley

+0

обновлено ... хотя это довольно нестандартно и не уверен, что это будет generalize – Jeff

+0

Спасибо большое. Я не знал этого трюка. – ezbentley