如何用Pandas统计h1与h2组合的唯一日期数量?
解决方案:统计h1+h2组合的唯一日期数量
嘿,我来帮你搞定这个分组统计唯一日期的问题~先理清楚整个问题的来龙去脉:
原始数据与需求
你的原始DataFrame是这样的:
import pandas as pd data = { "h1": ["002599f58e", "002599f58e", "005344fe83", "005344fe83", "005344fe83"], "h2": ["A", "A", "C", "D", "D"], "date": ["2019-09-23", "2019-09-24", "2019-09-30", "2019-10-02", "2019-10-03"], "c": [1, 3, 7, 1, 2] } df = pd.DataFrame(data)
对应的表格展示:
| h1 | h2 | date | c | |
|---|---|---|---|---|
| 0 | 002599f58e | A | 2019-09-23 | 1 |
| 1 | 002599f58e | A | 2019-09-24 | 3 |
| 2 | 005344fe83 | C | 2019-09-30 | 7 |
| 3 | 005344fe83 | D | 2019-10-02 | 1 |
| 4 | 005344fe83 | D | 2019-10-03 | 2 |
你需要实现的是:统计每个h1与h2组合对应的唯一日期数量,期望输出如下:
| h1 | h2 | count | |
|---|---|---|---|
| 0 | 002599f58e | A | 2 |
| 1 | 005344fe83 | C | 1 |
| 2 | 005344fe83 | D | 2 |
你尝试的代码问题分析
你之前写的代码:
days = df.groupby(["h1", df["date"].dt.floor("D"), "h3"]).size().reset_index(name="count")
没法正常运行主要有两个原因:
- 你的DataFrame里根本没有
h3这个列,属于引用了不存在的列名; - 需求是按
h1+h2分组统计日期的唯一值,但你错误地把date也加入了分组键,这样会把每个日期单独拆分成组,完全达不到统计唯一日期数的目的。
正确的实现方案
这里给你两种简单高效的实现方式,都能完美满足你的需求:
方法1:用groupby + nunique()(最直观)
直接按h1和h2分组,然后对date列调用nunique()统计唯一值的数量:
# 如果date列不是datetime类型,先转换(可选但推荐) df["date"] = pd.to_datetime(df["date"]) # 分组统计唯一日期数 result = df.groupby(["h1", "h2"])["date"].nunique().reset_index(name="count")
运行后得到的结果和你期望的完全一致:
h1 h2 count 0 002599f58e A 2 1 005344fe83 C 1 2 005344fe83 D 2
方法2:用groupby + agg()(更灵活)
如果之后你需要同时统计多个指标(比如还想统计c列的总和),agg()的写法会更易于扩展,这里我们只统计日期的唯一值数量:
df["date"] = pd.to_datetime(df["date"]) result = df.groupby(["h1", "h2"]).agg(count=("date", "nunique")).reset_index()
这个方法的输出和方法1完全相同,只是写法更适合多指标统计的场景。
内容的提问来源于stack exchange,提问作者Dervin Thunk
相关产品推荐
相关产品推荐

