2013-07-02 70 views
3

如果我有以下格式(存儲在大熊貓數據幀)的數據資料,基本類別和商品的蛞蝓的歸一化形式:Denormalise使用熊貓

pandas.DataFrame: 

           categories      slug            wares 
0      [developer, mac, web]    alex.payne [macbook-pro, cinema-display, readynas-nv-plus... 
1       [mac, musician]    jona.bechtolt [audio-kontrol-1, powershot-sd1000, live, mda-... 
2      [game, suit, windows]    gabe.newell [oa-desk, beyond-tv, windows-xp, office, visua... 
3    [developer, mac, software]    steven.frank [mac-pro, macbook-air, apple-tv, itunes, addre... 

而且我的意圖是要繪製圖表與商品相關的類別的,我所需要的數據在去歸一化格式,在一些這樣的格式:

categories wares slug 
0 developer macbook-pro  alex.payne 
1 mac  macbook-pro  alex.payne 
2 web  macbook-pro  alex.payne 
3 developer cinema-display alex.payne 
4 mac  cinema-display alex.payne 
5 web  cinema-display alex.payne 
6 developer readynas-nv-plus alex.payne 

什麼是將數據從格式轉換上方到下方的一個最好的方法,優選地,一個,這也利用了numpy的內部,所以它很快。

我的方法是相當幼稚的,循環遍歷數據框中的每一行,維護一個元組列表,然後將它傳遞給pandas.DataFrame構造函數。你的任何建議可能會變得越來越快,所以建議離開!

我也在考慮熊貓DataFrame中的這種數據的替代表示,特別是稀疏矩陣。但是我認爲這對於groupby查詢尤其更好。如果還有其他格式,或者稀疏矩陣爲這種彙總查詢提供了更好的結果,請提出如何解決這個問題。

這是整個事情,對於那些感興趣的人:http://j.mp/lp-usesthis我最終沒有按照我原先的意圖去做反規範化處理,而只是繞過感興趣的列。但任何能夠更好地規範化的能力都會使它變得更好。

+0

ü可以顯示你當前的代碼? – Jeff

+0

相關:http://stackoverflow.com/questions/17116814/pandas-how-do-i-split-text-in-a-column-into-multiple-columns/17116976#17116976 –

回答

1

首先,我強烈建議您不要像這樣將數據存儲在第一位,熊貓並非真正用於像列表這樣的一般對象。

以下是一種提取數據的方法(使用連接,similar to Dan Allen's answer)。

def denormalise(df, *colnames): 
    df1 = df.copy() # optional, but means we're not changing df globally 
    cols = [(colname, df1.pop(colname).apply(pd.Series).stack()) for colname in colnames] 
    for colname, c in cols: 
     c.index = c.index.droplevel(-1) 
     c.name = colname 
     df1 = df1.join(c) 
    return df1 
    # optionally .reindex_axis(df.columns, axis=1) # reorder columns 
    #  and .reset_index(drop=True)   # 0,1,...n index 

在使用中:

In [11]: denormalise(df1, 'wares') 
Out[11]: 
       categories   slug    wares 
0 [developer, mac, web]  alex.payne  macbook-pro 
0 [developer, mac, web]  alex.payne cinema-display 
0 [developer, mac, web]  alex.payne readynas-nv-plus 
1  [mac, musician] jona.bechtolt audio-kontrol-1 
1  [mac, musician] jona.bechtolt powershot-sd1000 
1  [mac, musician] jona.bechtolt    live 

熊貓允許您添加以此爲方便數據幀的方法:

In [12]: pd.DataFrame.denormalise = denormalise 

In [13]: df1.denormalise('wares', 'categories') 
Out[13]: 
      slug    wares categories 
0  alex.payne  macbook-pro developer 
0  alex.payne  macbook-pro  mac 
0  alex.payne  macbook-pro  web 
0  alex.payne cinema-display developer 
0  alex.payne cinema-display  mac 
0  alex.payne cinema-display  web 
0  alex.payne readynas-nv-plus developer 
0  alex.payne readynas-nv-plus  mac 
0  alex.payne readynas-nv-plus  web 
1 jona.bechtolt audio-kontrol-1  mac 
1 jona.bechtolt audio-kontrol-1 musician 
1 jona.bechtolt powershot-sd1000  mac 
1 jona.bechtolt powershot-sd1000 musician 
1 jona.bechtolt    live  mac 
1 jona.bechtolt    live musician 

In [14]: df1.denormalise('wares', 'categories').reset_index(drop=True) 
Out[14]: 
      slug    wares categories 
0  alex.payne  macbook-pro developer 
1  alex.payne  macbook-pro  mac 
2  alex.payne  macbook-pro  web 
3  alex.payne cinema-display developer 
4  alex.payne cinema-display  mac 
5  alex.payne cinema-display  web 
6  alex.payne readynas-nv-plus developer 
7  alex.payne readynas-nv-plus  mac 
8  alex.payne readynas-nv-plus  web 
9 jona.bechtolt audio-kontrol-1  mac 
10 jona.bechtolt audio-kontrol-1 musician 
11 jona.bechtolt powershot-sd1000  mac 
12 jona.bechtolt powershot-sd1000 musician 
13 jona.bechtolt    live  mac 
14 jona.bechtolt    live musician