Pandas按整数和时间差分组并求和

3
我试图在分组后对多列进行求和,这些列具有不同的类型(整数、浮点数和时间差)。
In [1]: import pandas

In [2]: df = pandas.DataFrame({'key': [1, 1, 2, 2], 'val1': range(4), 'val2': [pandas.Timedelta(seconds=i) for i in range(4)], 'val3': [0.1 * i for i in range(4)]})

In [3]: df
Out[3]: 
   key  val1     val2  val3
0    1     0 00:00:00   0.0
1    1     1 00:00:01   0.1
2    2     2 00:00:02   0.2
3    2     3 00:00:03   0.3

在这个例子中,val1是一个整数列,val2是一个时间差列,v3是一个浮点数列。
In [4]: df.groupby('key').sum()
Out[4]: 
     val1  val3
key            
1       1   0.1
2       5   0.5

求和后,时间差列已经消失

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

我错过了什么?

2个回答

3
文档所述,您可以针对每列指定要使用的聚合函数,并“强制”使用 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

1

默认情况下,当你对DataFrame进行groupby-sum操作时,pandas不会假设你想对所有非经典数值类型的列执行此操作。如果有一个字符串列,它也不会尝试对它们应用求和。

然而,正如你所指出的,你可以强制对该列进行求和,那么怎么样呢?

import pandas as pd

grouped = df.groupby('key')
pd.concat([grouped.sum(), grouped.val2.sum()], axis=1) 

请注意,您不需要重复昂贵的 groupby 操作本身。

与字符串求和方法的比较是一个很好的观点。我提供了一种解决方案,而不需要重复使用groupby。 - Guillaume Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接