我有一个包含50行的数据帧,例如来自R的BCI数据
import pandas.rpy.common as com
varespec = com.load_data('BCI', 'vegan')
我试图将一个函数应用于每一行,其中该函数接受一个“size”参数。你知道吗
def rare(y, size):
notabs = ~np.isnan(y)
t = y[notabs]
N = np.sum(t)
diff = N - t
rare = np.sum(1 - comb(diff, size)/comb(N, size))
return rare
如果size是整数,则可以正常工作:
varespec.apply(rare, axis=1, args=(20,))
我想做的是让size成为一个由50个元素组成的数组,所有元素都不同,这样每一行都有一个惟一的size值。如果我把大小设为50,它会传递整个向量,函数就不起作用了。我该怎么做
varespec.apply(rare, axis=1, args=(size,))
是否为每行使用大小唯一的元素?我可以做循环:
for i in xrange(50):
rare(varespec.iloc[i,:], size[i])
但是有没有更好的方法来使用apply函数呢?你知道吗
可以将该向量作为列添加到数据帧中(如果需要,请稍后删除):
然后更改
rare
函数:或者,如果不想更改
rare
,请将其包装:您可以将结果表示为对整个NumPy数组的计算,而不是对
varespec
的每一行调用一次rare
:这表明
using_rare
和using_arrays
产生相同的结果:这利用了
scipy.misc.comb
可以接受NumPy数组作为输入这一事实。所以可以调用comb(diff, size)
,其中diff
是一个形状数组(225,50),而size
是一个形状数组(50,50)。因为size
只在对comb
的调用中使用,所以只需两次对comb
的调用就可以执行所有的计算。不需要每行循环。你知道吗相关问题 更多 >
编程相关推荐