2012-06-14 60 views
10

我希望能夠創建帶有MultiIndexes的Pandas DataFrame的行和列索引,並從ASCII文本文件中讀取它。我的數據是這樣的:如何使用MultiIndex從/向ASCII文件寫入/讀取Pandas DataFrame?

col_indx = MultiIndex.from_tuples([('A', 'B', 'C'), ('A', 'B', 'C2'), ('A', 'B', 'C3'), 
            ('A', 'B2', 'C'), ('A', 'B2', 'C2'), ('A', 'B2', 'C3'), 
            ('A', 'B3', 'C'), ('A', 'B3', 'C2'), ('A', 'B3', 'C3'), 
            ('A2', 'B', 'C'), ('A2', 'B', 'C2'), ('A2', 'B', 'C3'), 
            ('A2', 'B2', 'C'), ('A2', 'B2', 'C2'), ('A2', 'B2', 'C3'), 
            ('A2', 'B3', 'C'), ('A2', 'B3', 'C2'), ('A2', 'B3', 'C3')], 
            names=['one','two','three']) 
row_indx = MultiIndex.from_tuples([(0, 'North', 'M'), 
            (1, 'East', 'F'), 
            (2, 'West', 'M'), 
            (3, 'South', 'M'), 
            (4, 'South', 'F'), 
            (5, 'West', 'F'), 
            (6, 'North', 'M'), 
            (7, 'North', 'M'), 
            (8, 'East', 'F'), 
            (9, 'South', 'M')], 
            names=['n', 'location', 'sex']) 
size=len(row_indx), len(col_indx) 
data = np.random.randint(0,10, size) 
df = DataFrame(data, index=row_indx, columns=col_indx) 
print df 

我試過df.to_csv()read_csv()但他們不保證指數。

我想使用額外的delimeters創建一個新的格式。例如,使用----------------行標記列索引的末尾,並使用|標記行索引的末尾。因此,它應該是這樣的:

one   | A A A A A A A A A A2 A2 A2 A2 A2 A2 A2 A2 A2 
two   | B B B B2 B2 B2 B3 B3 B3 B B B B2 B2 B2 B3 B3 B3 
three   | C C2 C3 C C2 C3 C C2 C3 C C2 C3 C C2 C3 C C2 C3 
-------------------------------------------------------------------------------------- 
n location sex :                  
0 North M | 2 3 9 1 0 6 5 9 5 9 4 4 0 9 6 2 6 1 
1 East  F | 6 2 9 2 7 0 0 3 7 4 8 1 3 2 1 7 7 5 
2 West  M | 5 8 9 7 6 0 3 0 2 5 0 3 9 6 7 3 4 9 
3 South M | 6 2 3 6 4 0 4 0 1 9 3 6 2 1 0 6 9 3 
4 South F | 9 6 0 0 6 1 7 0 8 1 7 6 2 0 8 1 5 3 
5 West  F | 7 9 7 8 2 0 4 3 8 9 0 3 4 9 2 5 1 7 
6 North M | 3 3 5 7 9 4 2 6 3 2 7 5 5 5 6 4 2 9 
7 North M | 7 4 8 6 8 4 5 7 9 0 2 9 1 9 7 9 5 6 
8 East  F | 1 6 5 3 6 4 6 9 6 9 2 4 2 9 8 4 2 4 
9 South M | 9 6 6 1 3 1 3 5 7 4 8 6 7 7 8 9 2 3 

大熊貓是否有辦法寫入/讀取從ASCII文件DataFrames到/與MultiIndexes?

+0

是的,只需將multi_sparse設置爲False! :) –

回答

11

不知道你所使用的大熊貓的版本,但與0.7.3您可以DataFrame導出到TSV文件,並通過這樣做保留指數:

df.to_csv('mydf.tsv', sep='\t') 

需要導出到TSV與CSV原因是因爲列標題中有,個字符。這應該解決你的問題的第一部分。

第二部分有點棘手,因爲據我所知,您需要預先了解您希望DataFrame包含的內容。特別是,你需要知道:

  1. 哪個對你TSV列代表一行MultiIndex
  2. 和列的其餘部分也應轉換爲MultiIndex

爲了說明這一點,讓讀回我們上面保存到一個新的DataFrame TSV文件:

In [1]: t_df = read_table('mydf.tsv', index_col=[0,1,2]) 
In [2]: all(t_df.index == df.index) 
Out[2]: True 

所以我們設法讀mydf.tsv變成DataFrame,其具有與原始df相同的行索引。但是:

In [3]: all(t_df.columns == df.columns) 
Out[3]: False 

這裏的原因是因爲大熊貓(據我可以告訴)沒有正確地分析標題行成MultiIndex的方式。正如我上面提到的,如果你知道beorehand您的TSV文件頭表示MultiIndex,那麼你可以執行以下操作來解決這個問題:

In [4]: from ast import literal_eval 
In [5]: t_df.columns = MultiIndex.from_tuples(t_df.columns.map(literal_eval).tolist(), 
               names=['one','two','three']) 
In [6]: all(t_df.columns == df.columns) 
Out[6]: True 
+0

我喜歡你想出的東西。我想我仍然會創建自己的格式,因爲我事先不知道該索引有多少列。謝謝。 – dailyglen

4

可以更改打印選項使用set_option

display.multi_sparse
: boolean
   默認True 「sparsify」 MultiIndex顯示
   (不顯示重複外水平 元件組內)

現在,作爲所希望的數據幀將被打印:

In [11]: pd.set_option('multi_sparse', False) 

In [12]: df 
Out[12]: 
one    A A A A A A A A A A2 A2 A2 A2 A2 A2 A2 A2 A2 
two    B B B B2 B2 B2 B3 B3 B3 B B B B2 B2 B2 B3 B3 B3 
three   C C2 C3 C C2 C3 C C2 C3 C C2 C3 C C2 C3 C C2 C3 
n location sex                  
0 North M 2 1 6 4 6 4 7 1 1 0 4 3 9 2 0 0 6 4 
1 East  F 3 5 5 6 4 8 0 3 2 3 9 8 1 6 7 4 7 2 
2 West  M 7 9 3 5 0 1 2 8 1 6 0 7 9 9 3 2 2 4 
3 South M 1 0 0 3 5 7 7 0 9 3 0 3 3 6 8 3 6 1 
4 South F 8 0 0 7 3 8 0 8 0 5 5 6 0 0 0 1 8 7 
5 West  F 6 5 9 4 7 2 5 6 1 2 9 4 7 5 5 4 3 6 
6 North M 3 3 0 1 1 3 6 3 8 6 4 1 0 5 5 5 4 9 
7 North M 0 4 9 8 5 7 7 0 5 8 4 1 5 7 6 3 6 8 
8 East  F 5 6 2 7 0 6 2 7 1 2 0 5 6 1 4 8 0 3 
9 South M 1 2 0 6 9 7 5 3 3 8 7 6 0 5 4 3 5 9 

注:在老年熊貓版本,這是pd.set_printoptions(multi_sparse=False)

相關問題