本文目录导读:

我来给你展示几个使用Pandas进行数据区间统计的常用方法。
基本区间统计 - cut() 函数
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'],
'年龄': [22, 35, 28, 45, 18, 52, 33, 41],
'分数': [85, 92, 78, 65, 95, 88, 72, 90]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 方法1:指定区间边界
bins = [0, 20, 30, 40, 50, 60]
age_groups = pd.cut(df['年龄'], bins=bins, labels=['青少年', '青年', '壮年', '中年', '老年'])
df['年龄分组'] = age_groups
print("\n年龄分组结果:")
print(df)
# 统计各年龄段人数
print("\n各年龄段人数统计:")
print(df['年龄分组'].value_counts().sort_index())
等宽区间统计
# 方法2:自动等宽划分(分成4组)
score_groups = pd.cut(df['分数'], bins=4, labels=['差', '中', '良', '优'])
df['分数等级'] = score_groups
print("等宽划分结果:")
print(df)
# 查看具体的分割点
print("\n分数分割点:")
print(pd.cut(df['分数'], bins=4).value_counts())
等频区间统计(分位数)
# 方法3:等频划分(按分位数)
score_groups_qcut = pd.qcut(df['分数'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
df['分数四分位'] = score_groups_qcut
print("等频划分结果:")
print(df)
# 查看每个区间的数据量
print("\n各分位数区间数据量:")
print(df['分数四分位'].value_counts().sort_index())
实际应用案例:销售数据分析
# 创建销售数据
np.random.seed(42)
sales_data = {
'日期': pd.date_range('2023-01-01', periods=100, freq='D'),
'销售额': np.random.randint(1000, 10000, 100),
'客户数量': np.random.randint(10, 100, 100)
}
sales_df = pd.DataFrame(sales_data)
# 定义销售额区间
sales_bins = [0, 2000, 4000, 6000, 8000, 10000]
sales_labels = ['低(<2000)', '中低(2000-4000)', '中等(4000-6000)',
'中高(6000-8000)', '高(8000-10000)']
sales_df['销售额区间'] = pd.cut(sales_df['销售额'],
bins=sales_bins,
labels=sales_labels)
print("销售数据前10行:")
print(sales_df.head(10))
# 统计各区间数据
print("\n各销售额区间统计:")
print(sales_df['销售额区间'].value_counts().sort_index())
# 添加更多统计信息
stats = sales_df.groupby('销售额区间').agg({
'销售额': ['count', 'mean', 'sum'],
'客户数量': 'mean'
}).round(2)
print("\n各区间详细统计:")
print(stats)
多维度区间统计
# 创建更复杂的示例数据
complex_data = {
'部门': ['销售']*20 + ['技术']*20 + ['市场']*20,
'绩效': np.random.randint(60, 100, 60),
'年龄': np.random.randint(25, 50, 60)
}
complex_df = pd.DataFrame(complex_data)
# 同时按部门和对绩效进行区间统计
perf_bins = [60, 70, 80, 90, 100]
perf_labels = ['不及格', '及格', '良好', '优秀']
complex_df['绩效等级'] = pd.cut(complex_df['绩效'],
bins=perf_bins,
labels=perf_labels)
# 部门与绩效等级的交叉统计
cross_tab = pd.crosstab(complex_df['部门'],
complex_df['绩效等级'],
margins=True,
margins_name='合计')
print("部门与绩效等级交叉统计:")
print(cross_tab)
# 多个维度分组统计
multi_stats = complex_df.groupby(['部门', '绩效等级']).agg({
'绩效': ['count', 'mean'],
'年龄': 'mean'
}).round(2)
print("\n多维分组统计:")
print(multi_stats)
动态区间划分
def dynamic_binning(data, num_bins=5):
"""动态创建等宽区间"""
min_val, max_val = data.min(), data.max()
bin_width = (max_val - min_val) / num_bins
# 创建区间边界
bins = [min_val + i * bin_width for i in range(num_bins + 1)]
labels = [f'等级{i+1}' for i in range(num_bins)]
return pd.cut(data, bins=bins, labels=labels, include_lowest=True)
# 应用动态区间
df['动态年龄分组'] = dynamic_binning(df['年龄'], num_bins=4)
print("动态区间划分结果:")
print(df[['姓名', '年龄', '动态年龄分组']])
高级统计:区间与聚合
# 创建月份和销售额数据
date_data = {
'月份': ['2023-01', '2023-02', '2023-03'] * 10,
'销售额': np.random.randint(5000, 30000, 30),
'成本': np.random.randint(3000, 20000, 30)
}
monthly_df = pd.DataFrame(date_data)
# 对销售额进行区间划分
monthly_df['销售区间'] = pd.cut(monthly_df['销售额'],
bins=[0, 10000, 20000, 30000],
labels=['小规模', '中等规模', '大规模'])
# 按区间和月份进行汇总
summary = monthly_df.groupby(['月份', '销售区间']).agg({
'销售额': ['count', 'mean', 'sum'],
'成本': 'mean'
}).round(2)
print("月度销售区间汇总:")
print(summary)
pd.cut()- 按照指定的区间边界进行等宽分段pd.qcut()- 按照分位数进行等频分段value_counts()- 统计每个区间的数据量groupby()- 按区间分组后进行聚合计算crosstab()- 创建交叉统计表
这些方法可以灵活组合,满足各种数据区间统计需求,关键是选择合适的区间划分策略(等宽或等频)和合适的统计指标。