Python:通过聚合维度将聚合函数应用于变量并选择列
我假设,我有一个包含变量V1、V2、V3的熊猫数据帧。我想执行以下聚合过程 myData.groupby(“V1”,as_index=False)[“V2”].sum() 然后将此结果与变量V3一起显示(如果可能的话,可以一步完成!)。我该怎么做,有什么建议吗?谢谢 编辑: 从原始数据帧:Python:通过聚合维度将聚合函数应用于变量并选择列,python,pandas,aggregate,Python,Pandas,Aggregate,我假设,我有一个包含变量V1、V2、V3的熊猫数据帧。我想执行以下聚合过程 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**
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的原样。有人能帮忙吗:)?设置考虑数据文件<代码> MyDATAs/COD>
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
在我看来,执行这项任务最惯用的方式是
myData.groupby('V1', as_index=False).agg('sum')
V1 V2 V3
0 1 4 6
1 2 4 6
选项2
设置索引
和这也可以工作,但在设置和重置索引时有点笨拙
myData.set_index('V1').sum(level='V1').reset_index()
V1 V2 V3
0 1 4 6
1 2 4 6
选项3
和
从长远来看,我们可以开始欣赏
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
嘿,你能给我们一些示例数据并解释一下你希望V3显示结果的方式吗?显示numpy解决方案是可以的,但需要注意的是,这些解决方案通常不是数据类型友好的,而且对于轻微的性能来说更为详细gain@Jeff我正试图将两者都展示出来。我越来越擅长突出显示数据类型处理,我认为冗长是不言而喻的(我认为)。我认为对于任何简单的香草潘达西来说,提出numpy解决方案都是很容易混淆的。我将编辑这个答案,并且我将制定一个脚本来与任何numpy风格的答案相衔接。@Jeff希望您能发现这些评论是合理的。