You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Pandas DataFrame获取两个分箱变量的联合频率?

问题描述

现有包含Temperature(温度)和Humidity(湿度)的Pandas DataFrame,数据如下:

TemperatureHumidity
17.688
22.181
13.688
26.471
25.672

生成该DataFrame的代码:

import pandas as pd
import numpy as np

data = {
    'Temperature': [17.6, 22.1, 13.6, 26.4, 25.6],
    'Humidity': [88, 81, 88, 71, 72]
}

df = pd.DataFrame(data)

需求:生成以分箱后的Temperature为列、分箱后的Humidity为索引的交叉表,表格值为两个分箱条件的联合出现频率(绝对或相对)。分箱规则为:

  • 温度:按0-4,4-8,...,28-32区间分箱
  • 湿度:按0-10,10-20,...,90-100区间分箱

已掌握单个变量的分箱及计数方法:

df['T_binned'] = pd.cut(df['Temperature'], bins=np.arange(0,32,4))
df['H_binned'] = pd.cut(df['Humidity'], bins=np.arange(0,100,10))
counts_T = df.groupby(by='T_binned').count()
counts_H = df.groupby(by='H_binned').count()

需要实现两个分箱条件的联合次数统计。

解决方案

方法1:groupby + unstack 分步实现

先对两个分箱列分组计数,再通过unstack调整格式得到交叉表:

# 1. 对湿度、温度分箱列分组,统计每组的绝对数量
joint_counts = df.groupby(['H_binned', 'T_binned']).size().reset_index(name='Count')

# 2. 将温度分箱转为列,缺失组合填充为0
cross_table = joint_counts.pivot(index='H_binned', columns='T_binned', values='Count').fillna(0)

# 可选:计算相对频率(占总样本的比例)
relative_cross_table = cross_table / cross_table.sum().sum()

执行后,cross_table即为绝对频率交叉表,示例输出如下:

H_binned(12, 16](16, 20](20, 24](24, 28]
(70, 80]0002
(80, 90]1110

其余无数据的分箱组合会显示为0。

方法2:直接使用pd.crosstab(更简洁)

Pandas内置的crosstab函数可直接生成符合要求的交叉表,一步完成:

# 生成绝对频率交叉表,保留所有分箱(即使无数据)
cross_table = pd.crosstab(
    index=pd.cut(df['Humidity'], bins=np.arange(0,100,10)),
    columns=pd.cut(df['Temperature'], bins=np.arange(0,32,4)),
    dropna=False  # 保留所有定义的分箱区间
).fillna(0)

# 可选:生成相对频率交叉表
relative_cross_table = pd.crosstab(
    index=pd.cut(df['Humidity'], bins=np.arange(0,100,10)),
    columns=pd.cut(df['Temperature'], bins=np.arange(0,32,4)),
    normalize=True,  # 计算占总样本的比例
    dropna=False
).fillna(0)

dropna=False参数确保所有预设的分箱区间都被保留,完全匹配你期望的输出格式。

内容的提问来源于stack exchange,提问作者user13132640

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:40:27