从记录中用熊猫索引几个 csv 文件?

Posted

技术标签:

【中文标题】从记录中用熊猫索引几个 csv 文件?【英文标题】:indexing several csv files with pandas from records? 【发布时间】:2012-02-13 11:01:07 【问题描述】:

我有一个包含两列但没有标题标签的 csv 文件列表 ("file1", "file2", ...")。我想为它们分配标题标签,并将它们分配为DataFrame,它由文件索引,然后由这些列标签索引。例如,我试过:

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)

这会产生一个 DataFrame,测试,由 "myfile1", "myfile2"... 索引但是,我希望每个都由 "col1""col2" 索引。我的问题是:

    我怎样才能使第一个索引是文件,第二个索引是我分配的列(在变量labels 中)?这样我就可以写了:

    test["myfile1"]["col1"]

目前,test["myfile1"] 只给了我一系列记录。

    另外,我怎样才能重新索引事物,以便第一个索引是每个文件的列标签,第二个是文件名?这样我就可以写了:

    test["col1"]["myfile1"]

print test["col1"],然后查看为myfile1, myfile2 显示的"col1" 的值等。

【问题讨论】:

DataFrame 是一种二维数据结构,具有列和行。我不太清楚您的数据是什么样的,但考虑使用面板,它是 3D 结构。 pandas.sourceforge.net/dsintro.html#panel 【参考方案1】:

如果您使用的是 pandas >= 0.7.0(目前仅在 GitHub 存储库中可用,不过我很快就会发布!),您可以连接 DataFrames 的字典:

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   

【讨论】:

以上是关于从记录中用熊猫索引几个 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

数据框合并在熊猫(0.7.3)中创建重复记录

如何在循环中附加多个熊猫数据框?

在python中处理几个大的csv [关闭]

在熊猫中,目前我这样做是为了在新行中附加索引,但它不会对我的 CSV 文件进行任何更改 [重复]

c#和Unity,更新已更改为CSV文件的记录

使用熊猫生成excel xlsx文件时的0索引[重复]