我正在练习使用带有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
的新手,我渴望摆脱循环。我只是不了解如何从申请中返回值。
答案 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=1
,foo
将应用于每个行(请参阅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