根据我之前的问题,按照回答用户的建议进行拆分和精确化: 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/