在类别中计算:相当于R的ddply在Python中?

eva*_*rks 12 python r

我有一些R代码我需要移植到python.然而,R的神奇data.frame和ddply让我无法在python中找到一个好方法.

样本数据(R):

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

样本计算:

y <- ddply(x, 'd', transform, v2=(v-min(v))/(max(v)-min(v)))
Run Code Online (Sandbox Code Playgroud)

样本输出:

  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
Run Code Online (Sandbox Code Playgroud)

所以这是我对那里的pythonistas的问题:你会怎么做?您有一个具有几个重要维度的数据结构.

对于每个(c),并且每个(d)计算(v-min(v))/(max(v)-min(v)))并将其与对应的(d,c)对相关联.

您可以随意使用您想要的任何数据结构,只要它们能够快速处理相当大的数据集(适合内存的数据集).

Wes*_*ney 19

事实上,在Python中,pandas是正确的(也是唯一的,我相信的)工具.它比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
Run Code Online (Sandbox Code Playgroud)

现在写一个小变换函数:

def f(group):
    v = group['v']
    group['v2'] = (v - v.min()) / (v.max() - v.min())
    return group
Run Code Online (Sandbox Code Playgroud)

请注意,这也处理NAs,因为v变量是pandas 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  
Run Code Online (Sandbox Code Playgroud)


Jos*_*ich 5

听起来像你想要大熊猫分组或聚合.