首页 > 解决方案 > 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

有没有办法在熊猫中有效地做到这一点?谢谢

标签: pythonpandas

解决方案


这可以pd.merge_asof在 pandas 中使用 & 随后的计算来完成。

这是一个完整的数据示例(原始数据加载到名为 的变量df中,并df.date转换为datetimefirst)

# 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

推荐阅读