Pandas如何对DataFrame按行列双维度分箱聚合指定列均值
双维度分箱聚合实现方法
直接通过双字段分箱+透视聚合即可实现需求,和你原有单维度分箱的区间规则完全兼容,不需要重构原有分箱逻辑。
核心实现代码
import pandas as pd import numpy as np # 沿用你之前定义的分箱区间规则 dir_bins = np.linspace(0, 360, 37) # 风向每10°一个分箱,匹配0-10、10-20...350-360的列格式 shear_bins = np.linspace(0.00, 0.80, 17) # 风切变每0.05一个分箱,匹配0.00-0.05格式的行索引 # 透视表实现双维度聚合 ratio_pivot = pd.pivot_table( df, values="Ratio", index=pd.cut(df["Shear"], bins=shear_bins), columns=pd.cut(df["Dir_117m"], bins=dir_bins), aggfunc="mean", fill_value=0 # 空分组填充0,和你原有单维度分箱的fillna逻辑一致 ) # 可选:将默认的Interval类型索引/列名转为你样例中的字符串格式 ratio_pivot.columns = [f"{int(col.left)}-{int(col.right)}" for col in ratio_pivot.columns] ratio_pivot.index = [f"{idx.left:.2f}-{idx.right:.2f}" for idx in ratio_pivot.index] ratio_pivot.index.name = "Shear"
等效groupby写法
如果你更熟悉groupby语法,用unstack转换行列结构即可得到完全一致的结果:
ratio_pivot = df.groupby([ pd.cut(df["Shear"], shear_bins), pd.cut(df["Dir_117m"], dir_bins) ])["Ratio"].mean().unstack(fill_value=0) # 后续索引重命名逻辑和上面一致
扩展说明
- 如果需要同时统计每个分箱的样本数量,只需要把
aggfunc参数改为["mean", "count"],即可同时输出均值和分组计数,不需要单独写统计函数。 - 如果数据存在超出分箱范围的异常值(比如Shear大于0.8、风向不在0-360区间),可以手动扩展bins上下限,或者在
pd.cut中加参数include_lowest=True避免数据被丢弃。
内容的提问来源于stack exchange,提问作者Lucas Willrich
相关产品推荐
相关产品推荐

