2013-04-09 2 views
2

панды делает его очень легко читать CSV-файл:Чтение пары ключ-значение в панд

pd.read_table('data.txt', sep=',') 

ли панды иметь что-то похожее на файл с парами ключ-значение? Я придумал это:

pd.DataFrame([dict([p.split('=') for p in l.split(',')]) for l in open('data.txt')]) 

Если не встроенный, то, возможно, что-то более идиоматическое?

Файл интерес выглядит следующим образом:

symbol=ESM3,exchange=GLOBEX,timestamp=1365428525690751,price=1548.00,quantity=551 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525697183,price=1548.00,quantity=551 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525714498,price=1548.00,quantity=551 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525734967,price=1548.00,quantity=551 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525735567,price=1548.00,quantity=555 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525735585,price=1548.00,quantity=556 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525736116,price=1548.00,quantity=556 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525740757,price=1548.00,quantity=556 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525748502,price=1548.00,quantity=556 
symbol=ESM3,exchange=GLOBEX,timestamp=1365428525748952,price=1548.00,quantity=557 

Он имеет те же клавиши на каждой строке, и в том же порядке. Нет нулевых значений. Таблица быть генерируемый:

exchange price quantity symbol   timestamp 
0 GLOBEX 1548.00 551\n ESM3 1365428525690751 
1 GLOBEX 1548.00 551\n ESM3 1365428525697183 
2 GLOBEX 1548.00 551\n ESM3 1365428525714498 
3 GLOBEX 1548.00 551\n ESM3 1365428525734967 
4 GLOBEX 1548.00 555\n ESM3 1365428525735567 
5 GLOBEX 1548.00 556\n ESM3 1365428525735585 
6 GLOBEX 1548.00 556\n ESM3 1365428525736116 
7 GLOBEX 1548.00 556\n ESM3 1365428525740757 
8 GLOBEX 1548.00 556\n ESM3 1365428525748502 
9 GLOBEX 1548.00 557\n ESM3 1365428525748952 

(. Я могу удалить \n из quantity с rstrip() после того как я принес его)

+1

Не могли бы вы привести пример того, как выглядит файл и какой формат вы хотите использовать в DataFrame? – DSM

+0

@DSM Я добавил пример. – chrisaycock

ответ

3

Если вы знаете имена ключей заранее, и если имена всегда появляются в том же порядке, то вы можете использовать конвертер, чтобы отрубить имена ключей, а затем использовать параметр names назвать столбцы:

import pandas as pd 

def value(item): 
    return item[item.find('=')+1:] 

df = pd.read_table('data.txt', header=None, delimiter=',', 
        converters={i:value for i in range(5)}, 
        names='symbol exchange timestamp price quantity'.split()) 
print(df) 

на ваших опубликованных данных урожайность

symbol exchange   timestamp price quantity 
0 ESM3 GLOBEX 1365428525690751 1548.00  551 
1 ESM3 GLOBEX 1365428525697183 1548.00  551 
2 ESM3 GLOBEX 1365428525714498 1548.00  551 
3 ESM3 GLOBEX 1365428525734967 1548.00  551 
4 ESM3 GLOBEX 1365428525735567 1548.00  555 
5 ESM3 GLOBEX 1365428525735585 1548.00  556 
6 ESM3 GLOBEX 1365428525736116 1548.00  556 
7 ESM3 GLOBEX 1365428525740757 1548.00  556 
8 ESM3 GLOBEX 1365428525748502 1548.00  556 
9 ESM3 GLOBEX 1365428525748952 1548.00  557 
+0

Это работает. Я могу автоматически устанавливать имена столбцов с помощью 'keys = [l.split ('=') [0: 2] [0] для l в open ('data.txt'). Readline(). Split (',')] ' – chrisaycock

+1

Вправо. Это хорошая идея. Или, возможно, немного проще: 'names = [item.split ('=') [0] для элемента в open ('data.txt'). Readline(). Split (',')]' – unutbu

2

Я не уверен, что лучший способ сделать это, но при условии, что разделители не найдены в значениях - это больно мой мозг думать о случаях угловых - то что-то вроде это не супер-элегантное, но прост:

>>> df = pd.read_csv("esm.csv", sep=",|=", header=None) 
>>> df2 = df.ix[:,1::2] 
>>> df2.columns = list(df.ix[0,0::2]) 
>>> df2 
    symbol exchange   timestamp price quantity 
0 ESM3 GLOBEX 1365428525690751 1548  551 
1 ESM3 GLOBEX 1365428525697183 1548  551 
2 ESM3 GLOBEX 1365428525714498 1548  551 
3 ESM3 GLOBEX 1365428525734967 1548  551 
4 ESM3 GLOBEX 1365428525735567 1548  555 
5 ESM3 GLOBEX 1365428525735585 1548  556 
6 ESM3 GLOBEX 1365428525736116 1548  556 
7 ESM3 GLOBEX 1365428525740757 1548  556 
8 ESM3 GLOBEX 1365428525748502 1548  556 
9 ESM3 GLOBEX 1365428525748952 1548  557 

в принципе, прочитать его, а затем сделать Разворотные себя, держа каждый другой элемент, а затем фиксируя имена столбцов.

+0

Это хорошо работает тоже, хотя решение @ unutbu работает в полтора раза. – chrisaycock

Смежные вопросы