给出下面的(完全矫枉过正)数据帧例如
import pandas as pd
import datetime as dt
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
有适用两种不同的聚集功能,同一列,而不必调用现有的内置方式agg
多次吗?
在语法错误,但直觉正确的,这样做将是:
# Assume `function1` and `function2` are defined for aggregating.
df.groupby("dummy").agg({"returns":function1, "returns":function2})
显然,Python中不允许重复键。 是否有任何其他的方式表达对输入agg
? 也许一个元组列表[(column, function)]
会更好地工作,以使应用到同一列中的多个功能呢? 但现在看来似乎只接受一本字典。
有没有一种解决方法除了定义,仅仅适用于两种功能的它内部的辅助功能? (如何会与聚集这项工作呢?)
你可以简单地通过功能列表:
In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]})
Out[20]:
returns
sum mean
dummy
1 0.285833 0.028583
或作为词典:
In [21]: df.groupby('dummy').agg({'returns':
{'Mean': np.mean, 'Sum': np.sum}})
Out[21]:
returns
Sum Mean
dummy
1 0.285833 0.028583
请问像这样的工作:
In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()})
Out[7]:
func2 func1
dummy
1 -4.263768e-16 -0.188565
这样做的一个明显的方法是通过指定一个字典映射列名的功能与聚集列表:
df.groupby("dummy").agg({'returns': [function1, function2]})
df.groupby("dummy").agg({'returns': ['sum', 'mean']})
returns
sum mean
dummy
1 0.328953 0.032895
不需要然而,如果你的函数只在列操作,语法是一个小更简单的字典,如果聚集在一个系列:
df.groupby("dummy")['returns'].agg([function1, function2])
df.groupby('dummy')['returns'].agg(['sum', 'mean'])
sum mean
dummy
1 0.328953 0.032895
这也消除了多指标的输出。
在较新版本的大熊猫,如果使用的是字典的聚集输出指定列名,你会得到一个FutureWarning
:
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
使用字典重命名列在v0.20过时。 在较新版本的熊猫,这可以更简单地通过传递一个元组的列表中指定。 如果指定这样的功能,需要被指定为(姓名,职务)对元组该列的所有功能。
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
要么,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895