2016-09-28 75 views
0

鏈接說我有高效地收集在數據幀

individual, location, food 
     1   A  a 
     1   A  b 
     1   B  a 
     1   A  c 
     2   C  a 
     2   C  b 

類型的數據幀,其中個人創造的位置和食物之間的聯繫。我想收集個人基礎上的所有鏈接。也就是說,如果在位置AB觀察並有一個單獨的(最終)食品在abc,我要鏈接所有這些地點和食物種類對對方:

location food 
      A  a 
      A  b 
      A  c 
      B  a 
      B  b 
      B  c 
      C  a 
      C  b 

一種 - 效率極低 - 這樣做的方式是

import itertools 
def foo(group): 
    list1 = group.location.unique() 
    list2 = group.food.unique() 
    return pd.DataFrame(data=list(itertools.product(list1, list2)), columns=['location', 'food']) 
df.groupby(df.individual).apply(foo) 

有沒有更好的方法來完成這件事?

回答

2

您可以使用numpy的meshgrid來獲得一些效率。

import itertools 
import numpy as np 
def foo(group): 
    list1 = group.location.unique() 
    list2 = group.food.unique() 
    return pd.DataFrame(data=list(itertools.product(list1, list2)), columns=['location', 'food']) 

def bar(group): 
    list1 = group.location.unique() 
    list2 = group.food.unique() 
    product = np.meshgrid(list1, list2) 
    # reversing the order is necessary to get the same output as foo 
    list3 = np.dstack([product[1], product[0]]).reshape(-1, 2) 
    return pd.DataFrame(data=list3, columns=['location', 'food']) 

我的機器上有一個小的,(〜20%),加速比

In [66]: %timeit df.groupby(df.individual).apply(foo) 
100 loops, best of 3: 2.57 ms per loop 

In [67]: %timeit df.groupby(df.individual).apply(bar) 
100 loops, best of 3: 2.16 ms per loop