python - Pandas - 满足要求的组中最后一行的行数
问题描述
我的数据是这样的
date group meet_criteria
2020-03-31 1 no
2020-04-01 1 yes
2020-04-02 1 no
2020-04-03 1 no
2020-04-04 1 yes
2020-04-05 1 no
2020-03-31 2 yes
2020-04-01 2 no
我想创建另一列,该列等于 1 除以自组中最后一个日期以来的天数,该列meet_criteria
是“是”(当前meet_criteria
被排除,如果一个组从未满足条件,则该值将为 0。 )
我想要的数据看起来像这样
date group meet_criteria last_time_met_criteria
2020-03-31 1 no 0
2020-04-01 1 yes 0
2020-04-02 1 no 1
2020-04-03 1 no 0.5
2020-04-04 1 yes 0.333333
2020-04-05 1 no 1
2020-03-31 2 yes 0
2020-04-01 2 no 1
有没有办法在熊猫中有效地做到这一点?谢谢
解决方案
这可以pd.merge_asof
在 pandas 中使用 & 随后的计算来完成。
这是一个完整的数据示例(原始数据加载到名为 的变量df
中,并df.date
转换为datetime
first)
# sorting necessary for how `merge_asof` will be used
df2 = df.sort_values(['date', 'group'])
# construct the `right` data frame of dates to lookup
df_meet_criteria = df2[df2.meet_criteria == 'yes'].copy()
df_meet_criteria['date_met_criteria'] = df_meet_criteria.date
# merge
# `by`: columns to do regular merge on
# `on`: columns to do as_of merge on
# `allow_exact_matches`: True -> closed interval, False -> open interval,
# i.e. latest date before current date
last_date = pd.merge_asof(
df2,
df_meet_criteria,
by='group',
on='date',
allow_exact_matches=False,
suffixes=('', '_y')
).sort_values(['group', 'date'])
# calculate the inverse_days.
last_date['days_since'] = (last_date.date - last_date.date_met_criteria).dt.days
last_date.loc[last_date.days_since == 0, 'days_since'] = np.nan
last_date['last_time_met_criteria'] = (1 / last_date.days_since).fillna(0)
final = last_date[['date', 'group', 'meet_criteria', 'last_time_met_criteria']]
最终数据框如下所示:
date group meet_criteria last_time_met_criteria
0 2020-03-31 1 no 0.000000
2 2020-04-01 1 yes 0.000000
4 2020-04-02 1 no 1.000000
5 2020-04-03 1 no 0.500000
6 2020-04-04 1 yes 0.333333
7 2020-04-05 1 no 1.000000
1 2020-03-31 2 yes 0.000000
3 2020-04-01 2 no 1.000000
推荐阅读
- neo4j - 根据 Neo4j 中的相同属性连接两个节点
- java - org.springframework.messaging.converter.MessageConversionException:无法从 [org.apache.qpid.jms.message.JmsMessage] 转换为 [java.lang.String]
- lua - ROBLOX LUA(u) 尝试在数据库上调用 nil 值
- visual-studio-code - VSCode:settings.json 文件无法识别 terminal.integrated 设置
- python - Pandas 数据框按列分组并将其余列添加到命名字典
- r - 有没有办法在 R 或 RStudio 中一次使用查找和替换多行?
- mongodb - spring-data-mongo-db 库更新后聚合工作异常
- epson - 如何在 Epson TM-m30(ANK 型号)上打印简体中文
- python - 如何将数据集切割成 X 和 Y 参数
- github-actions - 如何使用 - pull_request_review_comment 触发 GitHubActions