[英]Pandas computed column based on previous rows conditionally
我有一个 pandas dataframe 像这样:
date_open date_closed rate
id
284113 2020-02-21 08:47:00+00:00 2020-03-04 08:55:28+00:00 11.588895
284114 2020-02-21 08:47:05+00:00 2020-03-04 08:55:22+00:00 11.588895
284115 2020-02-21 08:47:09+00:00 2020-03-04 08:55:13+00:00 11.588895
284116 2020-02-21 08:47:13+00:00 2020-03-04 08:55:07+00:00 11.559593
284117 2020-02-21 08:47:17+00:00 2020-03-04 08:53:11+00:00 11.530291
... ... ...
373069 2020-04-22 16:31:30+00:00 2020-04-30 17:25:55+00:00 3.481590
373070 2020-04-22 16:31:35+00:00 2020-04-30 17:25:23+00:00 3.510351
373071 2020-04-22 16:31:40+00:00 2020-04-30 17:24:25+00:00 3.529525
381966 2020-04-30 17:26:11+00:00 2020-04-30 17:28:43+00:00 -0.162813
381969 2020-04-30 17:26:49+00:00 2020-04-30 17:28:30+00:00 -0.181308
[131 rows x 3 columns]
我想添加一列,称为efficiency
。
每行的efficiency
应计算为rate
s > 0 的总和除以当前行的date_closed
<= date_open
的行的rate
s <= 0 的总和。
在 python 代码(假设是字典列表而不是数据帧)中,我会达到这样的结果:
for element in list_of_dicts:
positive_rates = sum(list(filter(lambda x: x['rate'] > 0 and x['date_closed'] < element['date_open'], list_of_dicts)))
negative_rates = sum(list(filter(lambda x: x['rate'] < 0 and x['date_closed'] < element['date_open'], list_of_dicts)))
element['efficiency'] = postitive_rates / negative_rates
任何帮助,将不胜感激。 谢谢你。
我可以想到两种方法来解决这个问题,一种在速度方面更好,另一种在 memory 方面更好。
第一个:创建一个新的列group
,进行外部merge
,使用mask
过滤,按id
分组,应用 lambda function 到分组 Z6A8064B5DF479455500553C47C50 并分配结果:
df['group'] = 1
df_merge = df.reset_index().merge(df[['date_closed', 'rate', 'group']],
how='outer', on='group')
mask = df_merge['date_open'] >= df_merge['date_closed_y']
results = df_merge[mask].groupby('id')
.apply(lambda df: df[df.rate_y > 0].rate_y.sum() /
df[df.rate_y <= 0].rate_y.sum())
df['efficiency'] = results
第二种:只需apply
function 应用于每一行:
df['efficiency'] = df.apply(lambda x:
df[(df.date_closed <= x.date_open) & (df.rate > 0)].rate.sum()
/ df[(df.date_closed <= x.date_open) & (df.rate <= 0)].rate.sum(), axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.