【发布时间】:2015-10-23 22:29:00
【问题描述】:
问题:鉴于下面的数据框,我正在尝试编写将函数应用于三个不同列的代码,而无需编写三个单独的函数调用。
数据代码:
import pandas as pd
data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'days': [365, 365, 213, 318, 71],
'spend_30day': [22, 241.5, 0, 27321.05, 345],
'spend_90day': [22, 451.55, 64.32, 27321.05, 566.54],
'spend_365day': [854.56, 451.55, 211.65, 27321.05, 566.54]}
df = pd.DataFrame(data)
cols = df.columns.tolist()
cols = ['name', 'days', 'spend_30day', 'spend_90day', 'spend_365day']
df = df[cols]
df
下面的函数实质上将按年计算支出;如果某人在“天数”列中的天数少于 365 天,则以下函数将告诉我如果他们有 365 天会花费多少:
def annualize_spend_365(row):
if row['days']/(float(365)) < 1:
return (row['spend_365day']/(row['days']/float(365)))
else:
return row['spend_365day']
然后我将函数应用于特定列:
df.spend_365day = df.apply(annualize_spend_365, axis=1).round(2)
df
这完全符合我对那一列的要求。但是,我不想为三个不同的“支出”列(30、90、365)中的每一个重写这个。我希望能够编写代码,将这个函数概括并一次应用到多个列。
我以为我可以创建列及其各自日期的列表,使用“zip”函数,并将函数嵌套在 for 循环中,但我在下面的尝试最终失败了:
spend_cols = [df.spend_30day, df.spend_90day, df.spend_365day]
days_list = [30, 90, 365]
for col, day in zip(spend_cols, days_list):
def annualize_spend(row):
if (row.days/(float(day)) < 1:
return (row.col)/((row.days)/float(day))
else:
return row.col
col = df.apply(annualize_spend, axis = 1)
错误:
AttributeError: ("'Series' object has no attribute 'col'")
我不确定为什么循环方法会失败。无论如何,我希望获得有关如何在 pandas 中泛化函数应用的指导。提前致谢!
【问题讨论】:
标签: python function for-loop pandas