Python:通过聚合维度和选择列将聚合函数应用于变量

时间:2017-07-03 21:25:14

标签: python pandas aggregate

我假设,我有一个带变量V1,V2,V3的pandas DataFrame。我想做以下聚合过程     myData.groupby(" V1“,as_index = False)[" V2"]。sum() 然后将此结果与变量V3一起显示(如果可能的话,一步完成!)。我怎么能这样做,有什么建议吗?谢谢!

编辑: 从原始数据框:

V1    V2    V3
 1     2     4
 2     1     3
 1     4     1

我想收到:

V1    V2         V3
 1     **6**     4
 2     1         3
 1     **6**     1

所以保持V3不变。任何人都可以帮忙:))

1 个答案:

答案 0 :(得分:1)

<强>设置
考虑数据框myData

myData = pd.DataFrame(dict(V1=[1, 1, 2, 2], V2=[2] * 4, V3=[3] * 4))

   V1  V2  V3
0   1   2   3
1   1   2   3
2   2   2   3
3   2   2   3

选项1
groupby and agg
在我看来,这是执行此任务最惯用的方式。

myData.groupby('V1', as_index=False).agg('sum')

   V1  V2  V3
0   1   4   6
1   2   4   6

选项2
set_indexsum w/ level
这也有效,但设置和重置索引有点尴尬。

myData.set_index('V1').sum(level='V1').reset_index()

   V1  V2  V3
0   1   4   6
1   2   4   6

选项3
np.uniquenp.bincount
从视角来看,我们可以开始理解pandas在api方面为我们提供的内容。如果性能是必须的,您可以有时(但并非总是)减少执行时间,但您也承担了处理许多细微差别pandas的责任。而且,几乎总是,代码不太透明。

u, f = np.unique(myData.V1.values, return_inverse=True)

pd.DataFrame(dict(
        V1=u,
        V2=np.bincount(f, myData.V2.values),
        V3=np.bincount(f, myData.V3.values)
    )).astype(myData.dtypes)

   V1  V2  V3
0   1   4   6
1   2   4   6

计时

%timeit myData.groupby('V1', as_index=False).agg('sum')
%timeit myData.set_index('V1').sum(level='V1').reset_index()

1000 loops, best of 3: 1.54 ms per loop
1000 loops, best of 3: 1.52 ms per loop

%%timeit
u, f = np.unique(myData.V1.values, return_inverse=True)

pd.DataFrame(dict(
        V1=u,
        V2=np.bincount(f, myData.V2.values),
        V3=np.bincount(f, myData.V3.values)
    )).astype(myData.dtypes)

1000 loops, best of 3: 654 µs per loop