python - 如何通过更改时间段来计算唯一出现次数分组?

标签 python pandas

根据我之前的问题,按照回答用户的建议进行拆分和精确化: Pandas: How to group and aggregate data starting from constant and ending on changing date?

我需要聚合固定日期(例如一年的第一天)和一年中所有其他日期之间的数据。聚合是给定时间段内唯一值的计数,同时按日期分组。换句话说,它统计自月初或年初以来最新的唯一用户数。

date             value
01-01-2012       a
02-01-2012       b
05-01-2012       c
05-01-2012       c

01-02-2012       a
02-02-2012       a
02-02-2012       b
05-02-2012       d

应该输出:

date             Month to date unique  Year to date unique
01-01-2012       1                     1
02-01-2012       2                     2
05-01-2012       3                     3
01-02-2012       1                     3
02-02-2012       2                     3
05-02-2012       3                     4

数据当然是在 Pandas 数据框中。显而易见但非常笨拙的方法是在开始日期和移动日期之间创建 for 循环。这个问题看起来很流行。对于这种类型的计算,是否有一些合理的 pandas 内置方法?关于计算唯一值,我还想避免堆叠列表,因为我有大量的行和唯一值,但我不确定是否可能。

日期格式在这里根本不重要。

我正在查看 Pandas 窗口函数,但它看起来不像是一个解决方案。

最佳答案

我通过 transform 函数更改以前的解决方案,然后删除每个日期的重复项:

df["date"] = pd.to_datetime(df["date"], format="%d-%m-%Y")
df = df.sort_values('date')

f = lambda x: (~x.duplicated()).cumsum()

df["Month to date sum"] = df.groupby(df["date"].dt.month)["value"].transform(f)
df["Year to date sum"] = df.groupby(df["date"].dt.year)["value"].transform(f)
df = df.drop_duplicates('date', keep='last').drop('value', axis=1)
print (df)
        date  Month to date sum  Year to date sum
0 2012-01-01                  1                 1
1 2012-01-02                  2                 2
3 2012-01-05                  3                 3
4 2012-02-01                  1                 3
6 2012-02-02                  2                 3
7 2012-02-05                  3                 4

关于python - 如何通过更改时间段来计算唯一出现次数分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69115033/

相关文章:

python - 加载 JSON 数据时出错 - 找不到文件

python - 将某些 float 数据框列格式化为 Pandas 中的百分比

python - 从 pandas 数据框(库存)计算数据的更有效方法

python - Python lambda 函数中的外部变量

python - Eclipse/PyDev 覆盖@sys,找不到 Python 64 位解释器

python - "except error_perm, msg"中的error_perm 和msg 是否特殊?

python - 如何根据列值对 Pandas 数据框进行切片?

python - 使用 Python Pandas 从 XML/Json 创建 CSV

python - 如何在多个 csv 文件中收集样本

python - Django loaddata 忽略现有对象