1

我正在尝试在文件的单独部分中读取带有分层索引的空格分隔文件。这就是我想出的:

import pandas as pd
o = open(doc, 'rU')
for i in o:
    if i.startswith("DATA="):
        meta_ends=o.tell() + 5
        break
dp = pd.read_table(o, delim_whitespace=True, 
  lineterminator='\n', header=None, index_col=None)

文件如下所示:

 META (the exact structure is probably not relevant for this example)
 DATA=1 2 3 4
 5 6 7 9
 10 11 12 13    

数据具有空格分隔的列和换行符分隔的行。

我用 为行和列创建了 MultiIndexes,pd.MultiIndex.from_arrays我分别对其进行解析。这就是我应该结束的:

                               Column 1                Column 2
Row label 1 Row label 2
Koko maa    1989               2008231.0               4891866.0   
            1990               2036693.0               4924388.0   
Akaa        1989                  6436.0                 15637.0   
            1990                  6548.0                 15775.0   
Alajärvi    1989                  3777.0                 11653.0   
            1990                  3831.0                 11747.0   

我以前的方法是将数据部分读入内存,然后像这样创建一个 DataFrame:

col_index = pd.MultiIndex.from_arrays(cols)
row_index = pd.MultiIndex.from_arrays(rows)
return pd.DataFrame(data, index=row_index, columns=col_index)

使用 500Mb+ 数据和 5M 行标签和 50+ 列 Pandas 读取所有可用内存(16Gt 带交换,这不起作用)。使用 read_table,我可以通过只读取一次数据部分来节省内存。

我的问题是如何将行和列的 MultiIndexes 设置为现有的 DataFrame?

或者有没有办法给 read_table 一个外部的 MultiIndex?

4

1 回答 1

2

您可以在事后使用设置列和行索引

df.index = row_index
df.columns = col_index

例如,

import pandas as pd
import io

content = '''\
    176.792 -2.30523 0.430772 32016 1 1 2
    177.042 -1.87729 0.430562 32016 1 1 1
    177.047 -1.54957 0.431853 31136 1 1 1
    177.403 -0.657246 0.432905 31152 1 1 1
'''
df = pd.read_table(io.BytesIO(content), sep='\s+', header=None)
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = zip(*arrays)
row_index = pd.MultiIndex.from_tuples(tuples[:len(df)])
col_index = pd.MultiIndex.from_tuples(tuples[:len(df.columns)])
df.index = row_index
df.columns = col_index
print(df)

产量

             bar                 baz         foo       qux
             one       two       one    two  one  two  one
bar one  176.792 -2.305230  0.430772  32016    1    1    2
    two  177.042 -1.877290  0.430562  32016    1    1    1
baz one  177.047 -1.549570  0.431853  31136    1    1    1
    two  177.403 -0.657246  0.432905  31152    1    1    1
于 2013-04-08T12:39:57.197 回答