gpt4 book ai didi

python - 将自定义累积函数应用于 Pandas 数据框

转载 作者:太空狗 更新时间:2023-10-29 21:49:01 25 4
gpt4 key购买 nike

我有一个按日期排序的数据框:

df = pd.DataFrame({'idx': [1, 1, 1, 2, 2, 2],
'date': ['2016-04-30', '2016-05-31', '2016-06-31',
'2016-04-30', '2016-05-31', '2016-06-31'],
'val': [10, 0, 5, 10, 0, 0],
'pct_val': [None, -10, None, None, -10, -10]})
df = df.sort('date')
print df

date idx pct_val val
3 2016-04-30 2 NaN 10
0 2016-04-30 1 NaN 10
4 2016-05-31 2 -10 0
1 2016-05-31 1 -10 0
5 2016-06-31 2 -10 0
2 2016-06-31 1 NaN 5

我想按 idx 分组,然后应用具有一些简单逻辑的累积函数。如果 pct_val 为空,则将 val 添加到运行总计,否则将运行总计乘以 1 + pct_val/100'cumsum' 显示了 df.groupby('idx').val.cumsum() 的结果,而 'cumulative_func' 是我的结果想要。

         date  idx  pct_val  val  cumsum  cumulative_func
3 2016-04-30 2 NaN 10 10 10
0 2016-04-30 1 NaN 10 10 10
4 2016-05-31 2 -10 0 10 9
1 2016-05-31 1 -10 0 10 9
5 2016-06-31 2 -10 0 10 8
2 2016-06-31 1 NaN 5 15 14

知道是否有办法将自定义累积函数应用于数据框或实现此目的的更好方法吗?

最佳答案

我认为没有一种简单的方法可以使用矢量化来实现您的目标。我会首先尝试让某些东西正常工作,然后在需要时优化速度。

def cumulative_func(df):
results = []
for group in df.groupby('idx').groups.itervalues():
total = 0
result = []
for p, v in df.ix[group, ['pct_val', 'val']].values:
if np.isnan(p):
total += v
else:
total *= (1 + .01 * p)
result.append(total)
results.append(pd.Series(result, index=group))
return pd.concat(results).reindex(df.index)

df['cumulative_func'] = cumulative_func(df)

>>> df
date idx pct_val val cumulative_func
3 2016-04-30 2 NaN 10 10.0
0 2016-04-30 1 NaN 10 10.0
4 2016-05-31 2 -10 0 9.0
1 2016-05-31 1 -10 0 9.0
5 2016-06-31 2 -10 0 8.1
2 2016-06-31 1 NaN 5 14.0

关于python - 将自定义累积函数应用于 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37284083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com