在具有多个分隔符的pandas中读取多索引CSV

时间:2018-05-01 12:32:57

标签: python pandas

我试图创建一个人工可读的脚本,它将被多索引。它看起来像这样:

A
    one    : some data
    two    : some other data

B
    one    : foo
    three  : bar

我想用熊猫' read_csv自动将其作为多索引文件读取,\t:用作分隔符,以便我可以轻松地按部分切片(即A和B)。我理解header=[0,1]tupleize_cols之类的东西可能会被用于此目的,但我无法做到这一点,因为它似乎并不想读取标签和冒号正确。如果我使用sep='[\t:]',则会使用前导标签。如果我不使用正则表达式并使用sep='\t'阅读,它会使标签正确,但不会处理冒号。这可以使用read_csv吗?我可以逐行完成,但必须有一个更简单的方法:)

这是我想到的输出。我在索引和列中添加了标签,希望在阅读时可以应用:

                  value      
index_1   index_2
A         one     some data
          two     some other data
B         one     foo
          three   bar
编辑:我使用Ben.T的部分答案来获得我需要的东西。我不喜欢我的解决方案,因为我正在写一个临时文件,但它确实有效:

with open('temp.csv','w') as outfile:
    for line in open(reader.filename,'r'):
        if line[0] != '\t' or not line.strip():
            index1 = line.split('\n')[0]
        else:
            outfile.write(index1+':'+re.sub('[\t]+','',line))

pd.read_csv('temp.csv', sep=':', header=None, \
    names = ['index_1', 'index_2', 'Value'] ).set_index(['index_1', 'index_2'])

1 个答案:

答案 0 :(得分:0)

您可以在read_csv中使用两个分隔符,例如:

pd.read_csv( path_file, sep=':|\t', engine='python')

请注意engine='python'以防止出现警告。

编辑:使用您的输入格式似乎很难,但输入如:

A   one    : some data
A   two    : some other data
B   one    : foo
B   three  : bar

在A或B之后用\t作为分隔符,然后你得到一个多索引:

pd.read_csv(path_file, sep=':|\t', header = None, engine='python', names = ['index_1', 'index_2', 'Value'] ).set_index(['index_1', 'index_2'])