计算具有重复日期的滚动窗口唯一值pandas

发布于 2025-01-09 15:20:25 字数 2067 浏览 0 评论 0原文

如果我有一个像这样的 pandas DataFrame

dateperson_active
22/2John
22/2Marie
22/2Mark
23/2John
24/2Mark
24/2Marie

我如何根据时间在滚动窗口中计算 < 中的唯一值code>person_active,例如:2 天滚动窗口,因此最终结果如下:

dateperson_activepeople_active
22/2John3
22/2玛丽3
22/2马克3
23/2约翰3
24/2马克3
24/2玛丽3

这里的主要问题是我在每个人的日期上有重复的条目,所以一个简单的df.rolling('2d',on='date').count() 不会完成这项工作。

编辑:请考虑在大数据集中的实现以及计算时间如何扩展,该解决方案需要理想地适用于现实环境,因此如果计算时间太长,它就没那么有用。

If I have a pandas DataFrame like this

dateperson_active
22/2John
22/2Marie
22/2Mark
23/2John
24/2Mark
24/2Marie

how do I count in a rolling window based on time the unique values in person_active, for example: 2 days rolling window, so it ends up like this:

dateperson_activepeople_active
22/2John3
22/2Marie3
22/2Mark3
23/2John3
24/2Mark3
24/2Marie3

The main issue here is that I have duplicate entries on date for each person so a simple df.rolling('2d',on='date').count() won't do the job.

EDIT: Please consider implementation in a big dataset and how the time to compute will scale, the solution needs to be ideally applicable in a real-world environment so if it takes too long to compute it's not that useful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

简单爱 2025-01-16 15:20:25

IIUC,尝试:

#convert to datetime if needed
df["date"] = pd.to_datetime(df["date"], format="%d/%m")

#convert string name to categorical codes for numerical aggegation
df["people"] = pd.Categorical(df["person_active"]).codes

#compute the rolling unique count
df["people_active"] = (df.rolling("2D", on="date")["people"]
                         .agg(lambda x: x.nunique())
                         .groupby(df["date"])
                         .transform("max")
                       )

#drop the unneccessary column
df = df.drop("people", axis=1)

>>> df
        date person_active  people_active
0 1900-02-22          John            3.0
1 1900-02-22         Marie            3.0
2 1900-02-22          Mark            3.0
3 1900-02-23          John            3.0
4 1900-02-24          Mark            3.0
5 1900-02-24         Marie            3.0

IIUC, try:

#convert to datetime if needed
df["date"] = pd.to_datetime(df["date"], format="%d/%m")

#convert string name to categorical codes for numerical aggegation
df["people"] = pd.Categorical(df["person_active"]).codes

#compute the rolling unique count
df["people_active"] = (df.rolling("2D", on="date")["people"]
                         .agg(lambda x: x.nunique())
                         .groupby(df["date"])
                         .transform("max")
                       )

#drop the unneccessary column
df = df.drop("people", axis=1)

>>> df
        date person_active  people_active
0 1900-02-22          John            3.0
1 1900-02-22         Marie            3.0
2 1900-02-22          Mark            3.0
3 1900-02-23          John            3.0
4 1900-02-24          Mark            3.0
5 1900-02-24         Marie            3.0
弱骨蛰伏 2025-01-16 15:20:25

按日期分组,计算唯一值,然后就可以开始了:

df.groupby('date').nunique().rolling('2d').sum()

Group by date, count unique values and then you're good to go:

df.groupby('date').nunique().rolling('2d').sum()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文