从重采样数据帧的lambda函数的多个返回值创建多个列

时间:2017-10-23 15:26:52

标签: python pandas dataframe

参考this thread我试图将函数应用于返回多个值的时间序列。它建议使用pd.Series对象进行解决。

import pandas as pd
import numpy as np


def some_function(data):
    mu, std = norm.fit(data)
    a = mu * 3
    b = std * 5
    return a, b


rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
r = ts.resample('2h')
r[['a', 'b']] = r.agg(lambda x: pd.Series(some_function(x)))

但是,我想将此应用于重新采样数据,同时收到以下错误。我知道这是什么问题,但无法弄清楚如何实现我的目标。

ValueError: cannot set items on DatetimeIndexResampler

我想要的输出如下:

                       a   b
2011-01-01 00:00:00    mu1 std1
2011-01-01 02:00:00    mu2 std2

干杯!

2 个答案:

答案 0 :(得分:0)

这是你想要的吗?

def some_function(data):
    mu, std = norm.fit(data)
    a = mu * 3
    b = std * 5
    return a, b
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts.groupby(pd.TimeGrouper('2H')).apply(some_function).apply(pd.Series).rename(columns={0:'a',1:'b'})

Out[964]: 
                            a         b
2011-01-01 00:00:00  2.421663  5.230464
2011-01-01 02:00:00 -0.757646  0.966690
2011-01-01 04:00:00  1.642813  1.282784

答案 1 :(得分:0)

干杯,你让我走上了正确的道路,因为这似乎有效。但也许有更好的解决方案?

import pandas as pd
import numpy as np
from scipy.stats import norm


def some_function(data):
    mu, std = norm.fit(data)
    a = mu * 3
    b = std * 5
    return a, b


rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
s = ts.groupby(pd.TimeGrouper('2H')).apply(some_function)
df = pd.DataFrame(s.tolist(), columns=['a', 'b'], index=s.index)