2012-06-14 5 views
10

Pandas DataFrameを行と列のインデックスにMultiIndexesを付けて作成し、ASCIIテキストファイルから読み取れるようにしたいと考えています。私はdf.to_csv()read_csv()を試みたが、彼らはインデックスを保持しませんMultiIndexでPandas DataFrameをASCIIファイルとの間で読み書きするにはどうすればいいですか?

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 

:私のデータは次のようになります。

私はおそらく余分な区切り文字を使用して新しいフォーマットを作成することを考えていました。たとえば、列インデックスの末尾を示すには----------------の行を使用し、行インデックスの末尾を示すには|を使用します。だから、次のようになります。

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 

んパンダはMultiIndexesと/からASCIIファイルにデータフレームを読み/書きする方法がありますか?

+0

はい、multi_sparseをFalseに設定してください。 :) –

答えて

11

わからないあなたが使用しているが、0.7.3であなたは、TSVファイルにあなたのDataFrameをエクスポートすることができ、これを行うことによって、インデックスを保持パンダのバージョン:

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

あなたはCSV対TSVにエクスポートする必要がある理由列ヘッダーには,文字が含まれているためです。これはあなたの質問の最初の部分を解決するはずです。

2番目の部分はちょっと難しいですが、私の知る限りでは、DataFrameに含めるものを事前に知っておく必要があります。特に、あなたが知っている必要があります:あなたのTSVの列が行MultiIndex

  • を表し、列の残りの部分もこれを説明するためにMultiIndex
  • に変換されなければならないこと

    1. 、私たちは新しい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 
      

      だから我々はを読むために管理210を元のdfと同じ行インデックスを持つDataFrameに変換します。しかし:

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

      そしてMultiIndexに正しくヘッダー行を解析する方法がありません(私の知る限り)パンダので、ここに理由があります。私はあなたがあなたのTSVファイルヘッダがMultiIndexを表すことbeorehandわかっている場合、あなたはこれを修正するには、以下の操作を行うことができ、前述のように:

      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)ました。

    関連する問題