我有一些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)
样本计算:
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)对相关联。 / p>
随意使用您想要的任何数据结构,只要它们能够快速处理相当大的数据集(适合内存的数据集)。
答案 0 :(得分:19)
确实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
请注意,这也会处理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
答案 1 :(得分:5)
听起来你想要pandas和group by or aggregate。
答案 2 :(得分:2)
尽管一些丑陋的代码会更快,但如果组的数量非常大并且甚至可能比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=';')