本文目录导读:

我来详细讲解如何使用Pandas进行数据分位操作,包括多个实用案例。
基础分位操作
使用 quantile() 方法
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'score': [85, 92, 78, 95, 88, 73, 90, 82, 96, 70],
'name': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
})
# 计算单个分位数
median = df['score'].quantile(0.5) # 中位数
q1 = df['score'].quantile(0.25) # 第一四分位数
q3 = df['score'].quantile(0.75) # 第三四分位数
print(f"中位数: {median}")
print(f"Q1: {q1}")
print(f"Q3: {q3}")
# 计算多个分位数
quantiles = df['score'].quantile([0.25, 0.5, 0.75, 0.9])
print("\n多个分位数:")
print(quantiles)
使用 cut() 进行等宽分箱
# 将数据分箱
df['score_bins'] = pd.cut(df['score'],
bins=4, # 分成4组
labels=['低', '中低', '中高', '高'])
print("等宽分箱结果:")
print(df[['name', 'score', 'score_bins']])
使用 qcut() 进行等频分位
# 等频分箱(每个箱子包含相同数量的数据)
df['score_quantile'] = pd.qcut(df['score'],
q=4, # 分成4组
labels=['Q1', 'Q2', 'Q3', 'Q4'])
print("\n等频分箱结果:")
print(df[['name', 'score', 'score_quantile']])
# 查看分组统计
print("\n每组数量:")
print(df['score_quantile'].value_counts().sort_index())
实际案例:学生成绩分析
import pandas as pd
import numpy as np
# 创建更复杂的学生成绩数据集
np.random.seed(42)
students_data = pd.DataFrame({
'student_id': range(1, 101),
'name': [f'学生{i}' for i in range(1, 101)],
'chinese': np.random.randint(60, 100, 100),
'math': np.random.randint(50, 100, 100),
'english': np.random.randint(55, 100, 100),
'class': np.random.choice(['A班', 'B班', 'C班'], 100)
})
# 计算总分
students_data['total_score'] = (students_data['chinese'] +
students_data['math'] +
students_data['english'])
print("数据概览:")
print(students_data.head())
# 1. 成绩等级划分
students_data['grade'] = pd.qcut(students_data['total_score'],
q=[0, 0.25, 0.5, 0.75, 1.0],
labels=['D', 'C', 'B', 'A'])
# 2. 分班统计分析
print("\n各班级成绩等级分布:")
grade_by_class = pd.crosstab(students_data['class'], students_data['grade'])
print(grade_by_class)
# 3. 各科目百分位排名
students_data['chinese_percentile'] = students_data['chinese'].rank(pct=True)
students_data['math_percentile'] = students_data['math'].rank(pct=True)
students_data['english_percentile'] = students_data['english'].rank(pct=True)
print("\n前5名学生百分位排名:")
print(students_data.head()[['name', 'chinese_percentile', 'math_percentile', 'english_percentile']])
进阶应用:异常值检测
# 使用IQR方法检测异常值
def detect_outliers_iqr(data, column):
Q1 = data[column].quantile(0.25)
Q3 = data[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return (data[column] < lower_bound) | (data[column] > upper_bound)
# 检测各科目的异常值
for subject in ['chinese', 'math', 'english']:
outliers = detect_outliers_iqr(students_data, subject)
print(f"\n{subject} 异常值数量: {outliers.sum()}")
if outliers.any():
print(f"异常值学生: {students_data[outliers]['name'].tolist()}")
数据分段与可视化
import matplotlib.pyplot as plt
# 创建分位统计表
def quantile_summary(data, columns, quantiles=[0.1, 0.25, 0.5, 0.75, 0.9]):
summary = pd.DataFrame()
for col in columns:
summary[col] = data[col].quantile(quantiles)
summary.index = [f'{int(q*100)}%' for q in quantiles]
return summary
# 生成分位汇总
summary_stats = quantile_summary(students_data, ['chinese', 'math', 'english', 'total_score'])
print("分位汇总表:")
print(summary_stats)
# 可视化分位分布
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
subjects = ['chinese', 'math', 'english', 'total_score']
for ax, subject in zip(axes.flat, subjects):
# 使用qcut获取分位数标签
quantile_labels = pd.qcut(students_data[subject], q=5, labels=False)
# 绘制直方图
ax.hist(students_data[subject], bins=20, alpha=0.7, edgecolor='black')
ax.axvline(students_data[subject].median(), color='red', linestyle='--', label='中位数')
ax.axvline(students_data[subject].mean(), color='green', linestyle='--', label='均值')
ax.set_title(f'{subject} 分布')
ax.legend()
ax.set_xlabel('分数')
ax.set_ylabel('频数')
plt.tight_layout()
plt.show()
自定义分位函数
def custom_quantile_analysis(data, column, breaks=[0, 0.2, 0.4, 0.6, 0.8, 1.0]):
"""
自定义分位分析函数
"""
# 计算分位点
quantiles = data[column].quantile(breaks)
# 创建标签
labels = [f'{int(breaks[i]*100)}%-{int(breaks[i+1]*100)}%'
for i in range(len(breaks)-1)]
# 分箱
data['quantile_group'] = pd.qcut(data[column],
q=breaks,
labels=labels)
# 分组统计
result = data.groupby('quantile_group')[column].agg(['count', 'min', 'max', 'mean', 'std'])
return result
# 使用自定义函数
analysis_result = custom_quantile_analysis(students_data, 'total_score')
print("\n自定义分位分析结果:")
print(analysis_result)
实用技巧总结
常用分位方法对比
# 不同分位方法的比较
data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print("不同分位方法比较:")
print(f"默认方法 (linear): {data.quantile(0.5)}")
print(f"lower方法: {data.quantile(0.5, interpolation='lower')}")
print(f"higher方法: {data.quantile(0.5, interpolation='higher')}")
print(f"nearest方法: {data.quantile(0.5, interpolation='nearest')}")
print(f"midpoint方法: {data.quantile(0.5, interpolation='midpoint')}")
这些案例涵盖了Pandas数据分位的主要应用场景,根据你的具体需求,可以选择合适的方法进行数据分析。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播