是否存在类似的'transform'方法将函数应用于组(所有列一次)并返回一个对象?我尝试的任何东西似乎都会在组中的每列返回一个对象。
例如考虑数据
Maturity Date s Term Month
0 2012-02-01 00:00:00 2012-01-03 00:00:00 2.993 29 2
18 2012-03-01 00:00:00 2012-01-03 00:00:00 3.022 58 3
57 2012-04-01 00:00:00 2012-01-03 00:00:00 3.084 89 4
117 2012-05-01 00:00:00 2012-01-03 00:00:00 3.138 119 5
...
并假设我在Date上执行groupby并将一些函数应用于标记为(Term,Month,s)的组。结果应该是
Maturity result
2012-02-01 00:00:00 2012-01-03 object
2012-03-01 00:00:00 2012-01-03 object
2012-04-01 00:00:00 2012-01-03 object
....
我显然可以遍历这些组并聚合结果,但我想我只是遗漏了一些关于如何使用其中一种转换方法的明显信息。
答案 0 :(得分:3)
您可以应用该功能,然后手动聚合每个组。例如,假设聚合是一个均值,函数是列的总和,您可以:
df.groupby("Date")['Term', 'Month', 's'].apply(lambda rows: np.mean(rows['Term'] + rows['Month'] + rows['s']))
因此,如果我们假设一个fit
方法,从具有列"月"," Term"的数据框构建一些模型。和" s":
import pandas as pd
import numpy as np
def fit (dataframe):
return { "param1": np.mean(dataframe["Term"]) + np.max(dataframe["month"]), "param2": np.std(dataframe["s"])}
包含那些日期的colummns的数据框:
df = pd.DataFrame({"date": ["20140101", "20140202", "20140203"] * 4, "Term" : np.random.randint(100, size=12),"month": np.random.randint(12, size=12),"s": np.random.rand(12)*3})
print df
(输出:)
Term date month s
0 24 20140101 6 2.364798
1 43 20140202 9 0.066188
2 59 20140203 6 1.078052
3 40 20140101 3 1.982825
4 34 20140202 4 2.089518
5 20 20140203 1 2.412956
6 84 20140101 8 0.779843
7 62 20140202 9 0.918860
8 32 20140203 11 2.613289
9 16 20140101 9 0.788347
10 23 20140202 6 0.982986
11 27 20140203 1 0.658260
然后我们可以为每组行一次对所有列应用fit():
modelPerDate = df.groupby("date").apply(fit)
print modelPerDate
生成模型的数据框,每个日期一个:
date
20140101 {'param2': 0.70786647858131047, 'param1': 50.0}
20140202 {'param2': 0.71852297283637756, 'param1': 49.5}
20140203 {'param2': 0.83876295773013798, 'param1': 45.5}