2012-01-18 64 views
4

我有一個csv文件列表("file1", "file2", ...")有兩列,但沒有標題標籤。我想爲它們分配標題標籤,並將它們分配爲DataFrame,它由文件索引,然後由這些列標籤索引。例如,我想:用記錄中的熊貓索引幾個csv文件?

import pandas 

mydict = {} 
labels = ["col1", "col2"] 
for myfile in ["file1", "file2"]: 
    my_df = pandas.read_table(myfile, names=labels) 
    # build dictionary of dataframe records 
    mydict[myfile] = my_df 

test = pandas.DataFrame(mydict) 

這產生一個數據幀,測試,通過"myfile1", "myfile2"...索引然而,我想每個那些由"col1""col2"也被編入索引的。我的問題是:

  1. 我怎樣才能使它所以第一個指數是文件,第二個索引是我指定的列(在變量labels)?所以,我可以寫:

    test["myfile1"]["col1"]

現在,test["myfile1"]只給了我的一系列記錄。

  1. 另外,我怎樣才能重新索引東西,使第一個索引是每個文件的列標籤,第二個是文件名?所以,我可以寫:

    test["col1"]["myfile1"]

print test["col1"],然後看到myfile1, myfile2所示的"col1"值等

+0

DataFrame是一個2D數據結構,包含列和行。我不清楚你的數據是什麼樣子,但考慮使用面板,這是3D結構。 http://pandas.sourceforge.net/dsintro.html#panel – 2012-01-18 18:09:09

回答

6

如果您使用熊貓> = 0.7.0(目前只能在GitHub倉庫中找到,不過我會立即發佈!),你可以連接你的數據幀字典:

http://pandas.sourceforge.net/merging.html#more-concatenating-with-group-keys

In [6]: data 
Out[6]: 
{'file1.csv': A  B  
0 1.0914 -1.3538 
1 0.5775 -0.2392 
2 -0.2157 -0.2253 
3 -2.4924 1.0896 
4 0.6910 0.8992 
5 -1.6196 0.3009 
6 -1.5500 0.1360 
7 -0.2156 0.4530 
8 1.7018 1.1169 
9 -1.7378 -0.3373, 
'file2.csv': A  B  
0 -0.4948 -0.15551 
1 0.6987 0.85838 
2 -1.3949 0.25995 
3 1.5314 1.25364 
4 1.8582 0.09912 
5 -1.1717 -0.21276 
6 -0.2603 -1.78605 
7 -3.3247 1.26865 
8 0.7741 -2.25362 
9 -0.6956 1.08774} 


In [10]: cdf = concat(data, axis=1) 

In [11]: cdf 
O ut[11]: 
    file1.csv   file2.csv   
    A   B  A   B  
0 1.0914 -1.3538 -0.4948 -0.15551 
1 0.5775 -0.2392 0.6987  0.85838 
2 -0.2157 -0.2253 -1.3949  0.25995 
3 -2.4924  1.0896 1.5314  1.25364 
4  0.6910  0.8992 1.8582  0.09912 
5 -1.6196  0.3009 -1.1717 -0.21276 
6 -1.5500  0.1360 -0.2603 -1.78605 
7 -0.2156  0.4530 -3.3247  1.26865 
8 1.7018  1.1169 0.7741 -2.25362 
9 -1.7378 -0.3373 -0.6956  1.08774 

然後,如果你想切換列索引的順序,你可以這樣做:

In [14]: cdf.swaplevel(0, 1, axis=1) 
Out[14]: 
    A   B   A   B   
    file1.csv file1.csv file2.csv file2.csv 
0 1.0914 -1.3538 -0.4948 -0.15551 
1 0.5775 -0.2392  0.6987  0.85838 
2 -0.2157 -0.2253 -1.3949  0.25995 
3 -2.4924  1.0896  1.5314  1.25364 
4 0.6910  0.8992  1.8582  0.09912 
5 -1.6196  0.3009 -1.1717 -0.21276 
6 -1.5500  0.1360 -0.2603 -1.78605 
7 -0.2156  0.4530 -3.3247  1.26865 
8 1.7018  1.1169  0.7741 -2.25362 
9 -1.7378 -0.3373 -0.6956  1.08774 

或者,也許有點直截了當,你可以使用一個面板:

In [16]: p = Panel(data) 

In [17]: p 
Out[17]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 10 (major) x 2 (minor) 
Items: file1.csv to file2.csv 
Major axis: 0 to 9 
Minor axis: A to B 

In [18]: p = p.swapaxes(0, 2) 

In [19]: p 
Out[19]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 10 (major) x 2 (minor) 
Items: A to B 
Major axis: 0 to 9 
Minor axis: file1.csv to file2.csv 

In [20]: p['A'] 
Out[20]: 
    file1.csv file2.csv 
0 1.0914 -0.4948 
1 0.5775  0.6987 
2 -0.2157 -1.3949 
3 -2.4924  1.5314 
4 0.6910  1.8582 
5 -1.6196 -1.1717 
6 -1.5500 -0.2603 
7 -0.2156 -3.3247 
8 1.7018  0.7741 
9 -1.7378 -0.6956