2013-04-09 69 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 

(我可以從quantityrstrip()刪除\n我已經帶來了後話)

+1

您能舉一個例子,說明該文件的外觀以及您希望DataFrame使用何種格式? – DSM 2013-04-09 16:54:17

+0

@DSM我已經添加了一個示例。 – chrisaycock 2013-04-09 17:04:18

回答

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 in open('data.txt')。readline()。split(',' )]' – chrisaycock 2013-04-09 17:34:13

+1

沒錯。這是個好主意。或者,也許更簡單一點:'names = [item.split('=')[0] for open in open('data.txt')。readline()。split(',')]' – unutbu 2013-04-09 17:51:26

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 2013-04-09 17:35:09