
本教程详细阐述了如何在pandas dataframe中高效计算各列的均值,同时仅考虑数值落在指定分位数(如20%到80%)范围内的元素。我们将重点介绍利用df.rank(pct=true)方法创建精确的布尔掩码进行数据过滤,从而避免直接分位数比较可能遇到的类型或维度不匹配问题,确保计算结果的准确性和代码的健壮性。
在数据分析实践中,我们经常需要对数据集进行统计分析,例如计算平均值。然而,为了提高统计的鲁棒性或关注特定数据范围内的趋势,有时需要排除极端值或仅考虑落在特定分位数区间内的数据。例如,计算各列的均值,但只包括那些值位于20%到80%分位数之间的数据。本教程将介绍一种简洁而高效的方法来解决这一问题。
Pandas DataFrame的rank()方法是一个强大的工具,它可以为DataFrame中的每个元素计算其在所属列中的排名。当pct=True时,它会返回每个值在其列中的百分比排名(即分位数排名),范围从0到1。利用这一特性,我们可以轻松地构建一个布尔掩码来筛选出落在指定分位数范围内的值。
基本原理:
我们将通过一个具体的例子来演示如何实现这一过程。
步骤 1: 准备数据
首先,创建一个示例Pandas DataFrame,其中包含需要进行分析的数值列。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"A": [1, 1, 20, 2, 2, 3, 50, 7, 8, 15, 20, 35, 50, 70],
"B": [10, 100, 20, 20, 200, 30, 50, 70, 80, 150, 200, 350, 500, 700]
})
print("原始 DataFrame:")
print(df)输出:
原始 DataFrame:
A B
0 1 10
1 1 100
2 20 20
3 2 20
4 2 200
5 3 30
6 50 50
7 7 70
8 8 80
9 15 150
10 20 200
11 35 350
12 50 500
13 70 70步骤 2: 计算分位数排名
使用df.rank(pct=True)计算DataFrame中每个元素在其列中的百分比排名。
# 计算每个值在其列中的百分比排名
percentile_ranks = df.rank(pct=True)
print("\n各列的百分比排名:")
print(percentile_ranks)输出(部分):
各列的百分比排名:
A B
0 0.071429 0.071429
1 0.071429 0.500000
2 0.678571 0.178571
3 0.214286 0.178571
4 0.214286 0.785714
...从输出可以看出,每个值都被赋予了一个介于0到1之间的排名,表示它在所属列中的相对位置。
步骤 3: 构建过滤掩码
现在,我们可以根据所需的分位数范围(例如20%到80%)来构建一个布尔掩码。使用ge()(大于或等于)和le()(小于或等于)方法来检查百分比排名是否在指定区间内。
lower_quantile = 0.2
upper_quantile = 0.8
# 构建布尔掩码
mask = percentile_ranks.ge(lower_quantile) & percentile_ranks.le(upper_quantile)
print(f"\n过滤掩码 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(mask)输出(部分):
过滤掩码 (分位数范围: 20.0% - 80.0%):
A B
0 False False
1 False True
2 True False
3 True False
4 True True
...这个mask是一个与原始DataFrame形状相同的布尔DataFrame,True表示对应位置的值在目标分位数范围内,False则表示不在。
步骤 4: 应用掩码并计算均值
最后,将这个布尔掩码应用到原始DataFrame上,然后计算过滤后数据的各列均值。未通过筛选的值将变为NaN,在计算均值时会自动忽略。
# 应用掩码并计算均值
filtered_means = df[mask].mean()
print(f"\n过滤后各列的均值 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(filtered_means)输出:
过滤后各列的均值 (分位数范围: 20.0% - 80.0%): A 12.444444 B 110.000000 dtype: float64
完整代码块:
将上述步骤整合到一起,得到一个简洁高效的解决方案。
import pandas as pd
import numpy as np
# 准备数据
df = pd.DataFrame({
"A": [1, 1, 20, 2, 2, 3, 50, 7, 8, 15, 20, 35, 50, 70],
"B": [10, 100, 20, 20, 200, 30, 50, 70, 80, 150, 200, 350, 500, 700]
})
lower_quantile = 0.2
upper_quantile = 0.8
# 一步到位:计算分位数排名,构建掩码,应用掩码并计算均值
result_mean = df[df.rank(pct=True).ge(lower_quantile) & \
df.rank(pct=True).le(upper_quantile)].mean()
print(f"\n最终结果:过滤后各列的均值 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(result_mean)通过利用Pandas DataFrame.rank(pct=True)方法,我们可以简洁而高效地实现对各列数据在指定分位数范围内进行过滤,并计算其均值。这种方法避免了手动计算每个列的分位数阈值并逐列应用筛选的繁琐过程,提供了一个统一且易于理解的解决方案,极大地提高了数据处理的效率和代码的可读性。在需要进行鲁棒性统计分析或关注数据核心趋势时,这种技术尤为实用。
以上就是Pandas DataFrame:高效计算指定分位数范围内的列均值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号