繁体   English   中英

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

[英]pandas group by and summing over integer and timedelta

我正在尝试对具有异类类型(整数,浮点和时间增量)的分组依据求和

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是timedeltas列,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

我想念什么?

文档中所述,您可以为每个列指定想要的聚合函数,并为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 - sum一个数据帧,熊猫不认为要为所有的都是经典的数字类型不列这样做。 如果您有一列字符串,也不会尝试将总和应用于它们。

但是,由于正如您所指出的,您可以强制该列的总和,因此

import pandas as pd

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

请注意,您并没有重复昂贵的groupby op本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM