我是一名有用的助手,可以为您翻译文本。
我有一个分组的DataFrame,我想用一组函数对其进行聚合,这些函数应该映射到特定的列。对于单级列,可以使用
下面是一个示例。
让我们创建一些样本数据:
但是这当然行不通,因为一个“slice”并不可哈希,因此不能放在字典里。
解决方法是:
我有一个分组的DataFrame,我想用一组函数对其进行聚合,这些函数应该映射到特定的列。对于单级列,可以使用
groups.agg({'colname':<function>})
轻松实现。但是,我无法处理多级列,我只想引用其中的一级。下面是一个示例。
让我们创建一些样本数据:
import itertools
import pandas as pd
lev1 = ['foo', 'bar', 'baz']
lev2 = list('abc')
n = 6
df = pd.DataFrame({k: np.random.randn(n) for k in itertools.product(lev1,lev2)},
index=pd.DatetimeIndex(start='2015-01-01', periods=n, freq='11D'))
这看起来像:
bar baz foo
a b c a b c a b c
2015-01-01 -1.11 2.12 -1.00 0.18 0.14 1.24 0.73 0.06 3.66
2015-01-12 -1.43 0.75 0.38 0.04 -0.33 -0.42 1.00 -1.63 -1.35
2015-01-23 0.01 -1.70 -1.39 0.59 -1.10 -1.17 -1.51 -0.54 -1.11
2015-02-03 0.93 0.70 -0.12 1.07 -0.97 -0.45 -0.19 0.11 -0.79
2015-02-14 0.30 0.49 0.60 -0.28 -0.38 1.11 0.15 0.78 -0.58
2015-02-25 -0.26 0.51 0.82 0.05 -1.45 0.14 0.53 -0.33 -1.35
使用以下方式按月分组:
groups = df.groupby(pd.TimeGrouper('MS'))
基于列中的顶级定义一些函数:
funcs = {'bar': np.sum, 'baz': np.mean, 'foo': np.min}
然而,执行groups.agg(funcs)
会导致KeyError错误,因为它期望每个级别都有一个键,这是有道理的。
以下示例可以正常工作:
groups.agg({('bar', 'a'): np.mean})
bar
a
2015-01-01 -0.845554
2015-02-01 0.324897
但我不想在第二层指定每个键。因此,我正在寻找类似以下的解决方案:
groups.agg({('bar', slice(None)): np.mean})
但是这当然行不通,因为一个“slice”并不可哈希,因此不能放在字典里。
解决方法是:
def multifunc(group):
func = funcs[group.name[0]]
return func(group)
groups.agg(multifunc)
但是这种写法不够易读,也不符合“Pandonic”的风格。而且它不允许在同一列上执行多个函数,就像agg
函数那样。一定有更好/标准的方法来执行这样的任务,这并不是很罕见。
{'bar': np.sum, 'baz': np.mean, 'foo': np.min}
可能会起作用?欢迎提出意见! - joris