gpt4 book ai didi

Python数据框rolling_sum包含数字而不是日期

转载 作者:行者123 更新时间:2023-11-30 23:04:54 25 4
gpt4 key购买 nike

说出我的数据框的一部分df[(df['person_num'] == 1) | (df['person_num'] == 2) ] 看起来像这样:

person_num   Days    IS_TRUE
1 1 1
1 4 1
1 5 0
1 9 1
2 1 1
2 4 1
2 5 0
2 9 1

对于每个 person_num,我想计算“某一天之前的 7 天内发生了多少 IS_TRUE=1”之类的内容” 。因此,对于第 9 天,我计算了从第 2 天到第 8 天的 IS_TRUE=1 数,并将计数添加到新列 IS_TRUE_7day_WINDOW 中。结果将是:

person_num    Days    IS_TRUE    IS_TRUE_7day_WINDOW
1 1 1 0
1 4 1 1
1 5 0 2
1 9 1 1
2 1 1 0
2 4 1 1
2 5 0 2
2 9 1 1

我正在考虑使用这样的东西:

df.groupby('person_num').transform(pd.rolling_sum, window=7,min_periods=1)

但我认为rolling_sum仅适用于日期时间,并且该代码不适用于我的数据框。有没有一种简单的方法可以将 rolling_sum 转换为整数(在我的例子中为 Days)?或者还有其他方法可以快速计算我想要的列吗?

我使用 for 循环来计算 IS_TRUE_7day_WINDOW,但由于我的数据帧非常大,所以我花了一个小时才得到结果。我想像 rolling_sum 这样的东西会加速我的旧代码。

最佳答案

您可以通过矢量化隐式执行 for 循环,这通常比显式编写 for 循环更快。以下是您提供的数据的工作示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Days': [1, 4, 5, 9, 1, 4, 5, 9],
'IS_TRUE': [1, 1, 0, 1, 1, 1, 0, 1],
'person_num': [1, 1, 1, 1, 2, 2, 2, 2]})

def window(group):
diff = np.subtract.outer(group.Days, group.Days)
group['IS_TRUE_7day_WINDOW'] = np.dot((diff > 0) & (diff <= 7),
group['IS_TRUE'])
return group

f.groupby('person_num').apply(window)

输出是这样的:

   Days  IS_TRUE  person_num  IS_TRUE_7day_WINDOW
0 1 1 1 0
1 4 1 1 1
2 5 0 1 2
3 9 1 1 1
4 1 1 2 0
5 4 1 2 1
6 5 0 2 2
7 9 1 2 1

关于Python数据框rolling_sum包含数字而不是日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33442504/

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