2013-07-19 218 views
7

我是熊貓新手,這是我在stackoverflow上的第一個問題,我試圖用大熊貓做一些分析。從多個記錄創建一個熊貓數據框

我有一些文本文件需要處理數據記錄。文件的每一行都與記錄匹配,記錄哪些字段位於固定位置,並且長度爲固定數量的字符。在同一個文件中有不同種類的記錄,根據記錄的類型,所有記錄共享第一個字段,它們是兩個字符。舉個例子:

Some file: 
01Jhon  Smith  555-1234           
03Cow   Bos primigenius taurus  00401     
01Jannette Jhonson   00100000000        
... 


field start length 
type   1  2 *common to all records, example: 01 = person, 03 = animal 
name   3  10 
surname  13  10 
phone  23  8 
credit  31  11 
fill of spaces 

我正在寫一些代碼來一個記錄轉換爲詞典:

person1 = {'type': 01, 'name': = 'Jhon', 'surname': = 'Smith', 'phone': '555-1234'} 
person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 

如果一個字段爲空(用空格填充)不會有在字典中) 。

對於所有記錄中的一種,我想用dicts鍵創建一個pandas DataFrame作爲列名,我嘗試使用pandas.DataFrame.from_dict()而沒有成功。

這裏來了我的問題:有沒有辦法用熊貓來做到這一點,所以字母鍵成爲列名?是否有其他標準方法來處理這類文件?

回答

7

爲了從字典中的數據框,你可以通過字典的列表

>>> person1 = {'type': 01, 'name': 'Jhon', 'surname': 'Smith', 'phone': '555-1234'} 
>>> person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
>>> animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 
>>> pd.DataFrame([person1]) 
    name  phone surname type 
0 Jhon 555-1234 Smith  1 
>>> pd.DataFrame([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 
>>> pd.DataFrame.from_dict([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 

對於兩個不同格式的文件混合的更基本的問題,並假設這些文件並沒有那麼大,我們不能讀取它們並將它們存儲在內存中,我會使用StringIO來創建一個有點像文件但只有我們想要的行的對象,然後使用read_fwf(固定寬度文件) 。例如:

from StringIO import StringIO 

def get_filelike_object(filename, line_prefix): 
    s = StringIO() 
    with open(filename, "r") as fp: 
     for line in fp: 
      if line.startswith(line_prefix): 
       s.write(line) 
    s.seek(0) 
    return s 

然後

>>> type01 = get_filelike_object("animal.dat", "01") 
>>> df = pd.read_fwf(type01, names="type name surname phone credit".split(), 
        widths=[2, 10, 10, 8, 11], header=None) 
>>> df 
    type  name surname  phone  credit 
0  1  Jhon Smith 555-1234  NaN 
1  1 Jannette Jhonson  NaN 100000000 

應該工作。當然你也可以在pandas有史以來看到它們之前將文件分成不同的類型,這可能是最簡單的。

+0

謝謝,_list of_dicts是關鍵。這些文件是數百Mb的gzip壓縮文件和幾個Gbs未壓縮的文件,因此將逐行讀取並追加到相應的DataFrame中。 – tinproject

相關問題