pandas groupby应用带有N列帧并返回对象的函数

时间:2014-03-06 16:23:10

标签: python pandas

是否存在类似的'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
....

我显然可以遍历这些组并聚合结果,但我想我只是遗漏了一些关于如何使用其中一种转换方法的明显信息。

1 个答案:

答案 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}