从Pandas中的apply函数返回多个对象

时间:2015-06-10 21:13:01

标签: python pandas dataframe

我正在练习使用带有Pandas数据帧的apply

所以我制作了一个简单的数据框,其中包含日期和值:

dates = pd.date_range('2013',periods=10)
values = list(np.arange(1,11,1))
DF = DataFrame({'date':dates, 'value':values})

我有第二个数据帧,它由3行原始数据帧组成:

DFa = DF.iloc[[1,2,4]]

所以,我想使用第二个数据框DFa,并从每一行获取日期(使用apply),然后查找并总结原始数据框中的任何日期早期:

def foo(DFa, DF=DF):
    cutoff_date = DFa['date']
    ans=DF[DF['date'] < cutoff_date]

DFa.apply(foo, axis=1)

事情很好。我的问题是,由于我已经创建了3个ans,我该如何访问这些值?

显然我是apply的新手,我渴望摆脱循环。我只是不了解如何从申请中返回值。

2 个答案:

答案 0 :(得分:1)

您的函数需要返回一个值。如,

def foo(df1, df2):
    cutoff_date = df1.date
    ans = df2[df2.date < cutoff_date].value.sum()
    return ans


DFa.apply(lambda x: foo(x, DF), axis=1)

另请注意,apply会返回DataFrame。因此,您当前的函数会为DataFrame中的每一行返回DFa,因此最终会得到DataFrame DataFrames

答案 1 :(得分:1)

你使用apply的方式有点混乱。使用axis=1foo将应用于每个(请参阅docs),但您的代码(通过参数名称)暗示其第一个参数是一个DataFrame。

此外,您声明要为那些小于日期的数据总结原始DataFrame的值。所以foo需要这样做,并返回值。

所以代码需要看起来像这样:

def foo(row, DF=DF):
    cutoff_date = row['date']
    return DF[DF['date'] < cutoff_date].value.sum()

进行更改后,当foo返回标量时,apply将返回一个系列:

>> DFa.apply(foo, axis=1)
1     1
2     3
4    10
dtype: int64