如何通过Pandas GroupBy实现两列不同分箱的联合计数统计?
实现多列不同分箱规则的分组计数
直接给你可行的代码方案,不用拆分DataFrame,一次groupby就能搞定:
import pandas as pd data = [ {'a': 11, 'b': 1}, {'a': 22, 'b': 1}, {'a': 25, 'b': 5}, {'a': 11, 'b': 1}, {'a': 22, 'b': 2}, {'a': 15, 'b': 6}, ] df = pd.DataFrame(data) # 定义两列各自的分箱区间 a_bins = [10, 20, 30] b_bins = [1, 5, 10] # 同时按a列分箱和b列分箱的结果分组,统计每组数量 result = df.groupby([ pd.cut(df['a'], a_bins), pd.cut(df['b'], b_bins) ]).size().unstack(fill_value=0) print(result)
运行后会得到直观的二维统计结果:
b (1, 5] (5, 10] a (10, 20] 2 1 (20, 30] 2 1
关键说明:
- 直接把两个
pd.cut的分箱结果作为groupby的参数,就能实现双重分箱分组,一次完成统计 - 用
size()比count()更直接,专门用来统计每组的行数 - 最后用
unstack(fill_value=0)把多级索引结果转成二维表格,fill_value=0用来填充无数据的分组(避免出现NaN)
如果不需要二维表格,保留多级索引格式的话,去掉.unstack(fill_value=0)即可:
result = df.groupby([pd.cut(df['a'], a_bins), pd.cut(df['b'], b_bins)]).size()
结果为:
a b (10, 20] (1, 5] 2 (5, 10] 1 (20, 30] (1, 5] 2 (5, 10] 1 dtype: int64
这样就完全不用拆分DataFrame,一步到位实现你要的统计需求。
内容的提问来源于stack exchange,提问作者tetra1
相关产品推荐
相关产品推荐

