Python 熊猫按整数和时间增量分组和求和

Python 熊猫按整数和时间增量分组和求和,python,pandas,Python,Pandas,我正在尝试对具有异构类型(integer、float和timedelta)的group by之后的多个列求和 在本例中,val1是integer列,val2是timedelta列,v3是float列 In [4]: df.groupby('key').sum() Out[4]: val1 val3 key 1 1 0.1 2 5 0.5 求和后,timedelta列消失 In [5]: df.groupby('key')['

我正在尝试对具有异构类型(integer、float和timedelta)的group by之后的多个列求和

在本例中,val1是integer列,val2是timedelta列,v3是float列

In [4]: df.groupby('key').sum()
Out[4]: 
     val1  val3
key            
1       1   0.1
2       5   0.5
求和后,timedelta列消失

In [5]: df.groupby('key')['val2'].sum()
Out[5]: 
key
1   00:00:01
2   00:00:05
Name: val2, dtype: timedelta64[ns]
仅选择此列表明它是可求和的

In [6]: df.groupby('key')['val2', 'val3'].sum()
Out[6]: 
     val3
key      
1     0.1
2     0.5

In [7]: df.groupby('key')['val2', 'val3'].sum()
Out[7]: 
     val3
key      
1     0.1
2     0.5

我遗漏了什么?

默认情况下,当您
groupby
-
sum
一个数据帧时,pandas不会假定您希望对所有非经典数字类型的列都这样做。如果您有一列字符串,它不会尝试将总和也应用于它们

但是,正如您所指出的,您可以强制求此列的和,那么

import pandas as pd

grouped = df.groupby('key')
pd.concat([grouped.sum(), grouped.val2.sum()], axis=1) 
请注意,您没有重复昂贵的
groupby
op本身。

如中所述,您可以指定每列需要哪个聚合函数,并为val2列“强制”一个函数:

import numpy as np
...
In [68]: df.groupby('key').agg({'val1': np.sum, 'val2': np.sum, 'val3': np.sum})
Out[68]: 
     val3     val2  val1
key                     
1     0.1 00:00:01     1
2     0.5 00:00:05     5

与字符串和方法比较是一个很好的观点。我提出了一个解决方案,没有重复groupby
import numpy as np
...
In [68]: df.groupby('key').agg({'val1': np.sum, 'val2': np.sum, 'val3': np.sum})
Out[68]: 
     val3     val2  val1
key                     
1     0.1 00:00:01     1
2     0.5 00:00:05     5