gpt4 book ai didi

具有条件的 Python Pandas : Self-join for running cumulative total,

转载 作者:行者123 更新时间:2023-12-05 09:35:30 27 4
gpt4 key购买 nike

我是 Python Pandas 的新手,因此无法找到与许多普通 SQL 操作等效的句法。给定玩具场景:

id    rank   ts          alive
1 1 2015-11-01 1
1 2 2015-11-03 1
1 3 2015-11-07 1
2 1 2015-11-03 1
2 2 2015-11-08 1

我将如何实现以下目标:

id    rank   ts          alive   cumulative_age_in_days   mean_id_age_on_this_date
1 1 2015-11-01 1 0 0
1 2 2015-11-03 1 2 1
1 3 2015-11-07 1 6 5
2 1 2015-11-03 1 0 1
2 2 2015-11-08 1 5 6

其中 cumulative_day_age 是当前行的日期减去 ID 的最早日期。例如,在 2015-11-03 上,id=1 存在 2 天,因为它是在 2015-11-01 首次观察到的.在 2015-11-07,它是 6 天(2015-11-07 - 2015-11-01)。

其中 mean_id_age_on_this_date 是该行日期所有 id 的平均年龄,如果 idalive = 1 。所以对于 2015-11-03id=1 是 2 天,但是 id=2 是 0 天,所以 mean_id_age_on_this_date 是 (0+2)/2 = 1。

这两列在 SQL 中很容易完成,但我对 Python Pandas 的熟悉程度不高,因此这是一项极具挑战性的任务。感谢任何提示、代码或建议。

最佳答案

首先用 GroupBy.transform 减去每组的第一个最小天数使用 min 然后输出 timedeltas 通过 Series.dt.days 转换为天数, 然后将不匹配的值 df['alive'].eq(1) 转换为 Series.where 中的错误值并使用 GroupBy.transformmean:

df['ts'] = pd.to_datetime(df['ts'])

df['cumulative_age_in_days'] = df['ts'].sub(df.groupby('id')['ts'].transform('min')).dt.days

df['mean_id_age_on_this_date'] = (df['cumulative_age_in_days'].where(df['alive'].eq(1))
.groupby(df['ts'])
.transform('mean'))
print (df)
id rank ts alive cumulative_age_in_days \
0 1 1 2015-11-01 1 0
1 1 2 2015-11-03 1 2
2 1 3 2015-11-07 1 6
3 2 1 2015-11-03 1 0
4 2 2 2015-11-08 1 5

mean_id_age_on_this_date
0 0
1 1
2 6
3 1
4 5

关于具有条件的 Python Pandas : Self-join for running cumulative total,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65803923/

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