Pandas 具有单独索引和数据的多索引和只读表
我正在尝试读取一个以空格分隔的文件,该文件的分层索引位于文件的单独部分。这就是我想到的:Pandas 具有单独索引和数据的多索引和只读表,pandas,Pandas,我正在尝试读取一个以空格分隔的文件,该文件的分层索引位于文件的单独部分。这就是我想到的: 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=No
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
数据具有以空格分隔的列和以换行符分隔的行
我已经使用pd.MultiIndex.from_array
为行和列创建了多索引,我分别对其进行了解析。这就是我应该得到的结果:
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
我以前的方法是将数据部分读入内存,然后创建一个数据帧,如下所示:
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+列,熊猫可以读取所有可用内存(16Gt带交换,不起作用)。使用read_table,我可以通过只读取一次数据部分来节省内存
我的问题是如何将行和列的多索引设置为现有数据帧
或者有没有一种方法可以为read_table提供一个外部多索引?您可以使用
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
非常感谢。这完全回答了我的问题。使用这一点,我意识到(再次)我的数据实际上仅由空间分隔,并按列数分块。我将为此提出一个新问题。