使用Pandas统计每日类型数量
在实际数据处理场景中,我们经常会拿到包含日期、类型字段的原始数据,需要按天统计每个类型出现的次数,生成每日类型数量统计表。这种需求在用户行为分析、订单统计、日志分析等场景中非常常见,本文就介绍如何使用Pandas快速实现这个需求。
准备示例数据
首先我们先构造一份包含日期和类型的模拟DataFrame,方便后续演示转换过程。示例数据包含三列:date表示日期,type表示类型,other_col是无关的其他列,用于模拟真实场景下的冗余字段。
import pandas as pd
# 构造示例数据
data = {
"date": ["2024-05-01", "2024-05-01", "2024-05-01", "2024-05-02", "2024-05-02", "2024-05-03"],
"type": ["A", "B", "A", "A", "C", "B"],
"other_col": [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
# 将date列转换为日期类型,方便后续按日期分组
df["date"] = pd.to_datetime(df["date"])
print("原始数据:")
print(df)运行上述代码后,得到的原始数据如下:
原始数据:
date type other_col
0 2024-05-01 A 1
1 2024-05-01 B 2
2 2024-05-01 A 3
3 2024-05-02 A 4
4 2024-05-02 C 5
5 2024-05-03 B 6核心转换方法:使用透视表
Pandas的pivot_table函数是实现这个需求最简洁的方式,它可以按照指定的行、列维度对数据进行聚合统计。我们需要将日期作为行索引,类型作为列索引,统计每个组合的出现次数。
# 使用透视表统计每日类型数量
result = pd.pivot_table(
df,
index="date", # 行索引:日期
columns="type", # 列索引:类型
aggfunc="size", # 聚合方式:计数
fill_value=0 # 没有数据的位置填充0
)
# 重置索引,让date列变为普通列,方便后续处理
result = result.reset_index()
print("每日类型数量统计表:")
print(result)运行上述代码后,得到的统计结果如下:
每日类型数量统计表: type date A B C 0 2024-05-01 2 1 0 1 2024-05-02 1 0 1 2 2024-05-03 0 1 0
这里简单解释下参数作用:index指定分组的行维度为日期,columns指定分组的列维度为类型,aggfunc="size"表示统计每个分组的记录数,也就是对应日期下对应类型的数量,fill_value=0会把没有对应数据的位置填充为0,避免结果中出现缺失值。
另一种实现方式:使用groupby+unstack
如果不熟悉透视表的使用,也可以通过groupby分组后配合unstack方法实现同样的效果,这种方式的逻辑更贴近手动分组的思路。
# 先按日期和类型分组计数
grouped = df.groupby(["date", "type"]).size().reset_index(name="count")
# 将type列的值转换为列索引,得到每日类型数量
result2 = grouped.pivot(index="date", columns="type", values="count").fillna(0).reset_index()
print("使用groupby+unstack的结果:")
print(result2)运行后得到的统计结果和透视表方法完全一致。这种方式的思路是先对日期和类型两个维度做分组,统计每个组合的数量,再通过pivot方法把类型列的内容转换为列索引,最后填充缺失值为0即可。
结果优化
如果希望最终的统计表中日期格式更友好,或者需要按日期排序,可以做进一步的优化处理。
# 优化结果:日期格式转为字符串,按日期排序
result["date"] = result["date"].dt.strftime("%Y-%m-%d")
result = result.sort_values("date").reset_index(drop=True)
print("优化后的统计表:")
print(result)优化后的结果日期会显示为字符串格式,更适合直接导出或展示,同时确保了日期是按升序排列的。
总结
将包含日期和类型的DataFrame转换为每日类型数量统计表,核心思路就是按照日期和类型两个维度做分组计数,再将类型维度转换为列索引。推荐使用pivot_table方法,代码更简洁,只需要几行就能完成转换;如果更习惯分步处理,也可以选择groupby+unstack的方式。两种方法都能得到正确的统计结果,可以根据个人习惯选择使用。