我正在尝试处理一个数据帧,在该数据帧中我必须创建一个新列,以填充xnpv函数给出的结果
def xnpv(rate, values, dates):
if rate <= -1.0:
return float('inf')
d0 = dates[0] # or min(dates)
return sum([ vi / (1.0 + rate)**((di - d0).days / 365.0) for vi, di in zip(values, dates)])
F['newcolumn'] = F.apply(lambda x: xnpv(0.1, x['Cash'], x['Date']), axis=1)
当我执行上面的代码时,它给我以下错误:TypeError :(“'Timestamp'对象不支持索引”,“发生在索引0”) 请帮我解决这个问题
当我使用以下表达式
F['newcolumn'] = F.groupby('Name').apply(lambda x: xnpv(0.1, x['Cash'], x['Date']))
它给了我另一个错误:KeyError:0
答案 0 :(得分:0)
我认为问题正在逐步发生
d0 = dates[0]
dates
将是一个时间序列。我认为您假设这将是完整的“日期”列。当您在熊猫系列上发声时,apply(lambda x: f(x) axis=1)
x是行而不是列。因此x["date"]
将是一个时间戳,而不是您期望的一系列。
编辑:也许一个靠养育而不是依靠.apply()
的人会更好?
def xnpv(rate, values, dates):
return values / (1.0 + rate) ** ((dates - dates.min()).dt.days / 365.0)
F['newcolumn'] = xnpv(0.1, F['Cash'], F['Date'])
编辑2:这似乎对我有用。是否符合您的期望?
F = pd.DataFrame({"name":['a','a','a','a','b','b','b','b'],
"cash":[1,1,3,4,1,2,4,5],
"date":['2017-01-01','2017-02-01','2017-03-01','2017-04-01',
'2017-01-01','2017-02-01','2017-03-01','2017-04-01']
})
F["date"] = pd.to_datetime(F["date"])
def xnpv(rate, values, dates):
return sum(values / (1.0 + rate) ** ((dates - dates.min()).dt.days / 365.0))
F.groupby('name').apply(lambda x: xnpv(0.1, x['cash'], x['date']))