我试图在异构类型(整数,浮点数和时间值)之后对多个列进行求和
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
我缺少什么?
答案 0 :(得分:1)
默认情况下,当您groupby
- sum
一个DataFrame时,pandas不会假定您要为所有不属于经典数字类型的列执行此操作。如果您有一列字符串,它也不会尝试将总和应用于它们。
但是,正如您所指出的那样,您可以强制此列的总和,如何
import pandas as pd
grouped = df.groupby('key')
pd.concat([grouped.sum(), grouped.val2.sum()], axis=1)
请注意,您不会重复昂贵的groupby
操作本身。
答案 1 :(得分:1)
如documentation中所述,您可以指定每列所需的聚合函数,并“强制”使用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