如何从Pandas DataFrame获取两个分箱变量的联合频率?
问题描述
现有包含Temperature(温度)和Humidity(湿度)的Pandas DataFrame,数据如下:
| Temperature | Humidity |
|---|---|
| 17.6 | 88 |
| 22.1 | 81 |
| 13.6 | 88 |
| 26.4 | 71 |
| 25.6 | 72 |
生成该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] | 0 | 0 | 0 | 2 |
| (80, 90] | 1 | 1 | 1 | 0 |
其余无数据的分箱组合会显示为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
相关产品推荐
相关产品推荐

