在类别中计算:在Python中R的ddply等价吗?

问题描述:

我有一些R码需要移植到python。然而,R的magic data.frame和ddply让我无法找到一种在Python中执行此操作的好方法。在类别中计算:在Python中R的ddply等价吗?

的样本数据(R):

x <- data.frame(d=c(1,1,1,2,2,2),c=c(rep(c('a','b','c'),2)),v=1:6) 

样品计算:

y <- ddply(x, 'd', transform, v2=(v-min(v))/(max(v)-min(v))) 

输出示例:

d c v v2 
1 1 a 1 0.0 
2 1 b 2 0.5 
3 1 c 3 1.0 
4 2 a 4 0.0 
5 2 b 5 0.5 
6 2 c 6 1.0 

因此,这里是我的pythonistas那里的问题:你会如何照着做?您有一些重要维度的数据结构。对于每个(c)和每个(d)计算(v-min(v))/(max(v)-min(v)))并且将其与相应的(d,c)对相关联。

只要在相当大的数据集(适合内存的数据集)上快速使用,就可以随意使用任何想要的数据结构。

确实pandas是Python中正确(也是唯一,我相信)的工具。这是一个有点比plyr少神奇,但这里是如何使用GROUPBY功能来做到这一点:

df = DataFrame({'d' : [1.,1.,1.,2.,2.,2.], 
       'c' : np.tile(['a','b','c'], 2), 
       'v' : np.arange(1., 7.)}) 
# in IPython 
In [34]: df 
Out[34]: 
    c d v 
0 a 1 1 
1 b 1 2 
2 c 1 3 
3 a 2 4 
4 b 2 5 
5 c 2 6 

现在写一个小的变换函数:

def f(group): 
    v = group['v'] 
    group['v2'] = (v - v.min())/(v.max() - v.min()) 
    return group 

注意,这也处理来港,因为v变量一个熊猫Series对象。

现在组由d列,并将F:

In [36]: df.groupby('d').apply(f) 
Out[36]: 
    c d v v2 
0 a 1 1 0 
1 b 1 2 0.5 
2 c 1 3 1 
3 a 2 4 0 
4 b 2 5 0.5 
5 c 2 6 1 
+0

感谢您的完整示例。 – evanrsparks

听起来像你想pandasgroup by or aggregate

+0

和另外猜测:“变换组”方法大约1/4的第二个链接的页面。 –

您还可以,如果你使用numpyscipy实现更高的性能。

尽管一些丑陋的代码,它会更快,大熊猫的方式将是缓慢的,如果组的数量是非常大的,甚至有可能不如R.这将永远是除了R快:

import numpy as np 
import numpy.lib.recfunctions 
from scipy import ndimage 

x = np.rec.fromarrays(([1,1,1,2,2,2],['a','b','c']*2,range(1, 7)), names='d,c,v') 

unique, groups = np.unique(x['d'], False, True) 
uniques = range(unique.size) 
mins = ndimage.minimum(x['v'], groups, uniques)[groups] 
maxs = ndimage.maximum(x['v'], groups, uniques)[groups] 

x2 = np.lib.recfunctions.append_fields(x, 'v2', (x['v'] - mins)/(maxs - mins + 0.0)) 

#save as csv 
np.savetxt('file.csv', x2, delimiter=';')