2016-09-28 78 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