0

0

使用Pandas根据中位数绝对离差(MAD)选择DataFrame高变异性列

聖光之護

聖光之護

发布时间:2025-11-27 13:21:20

|

571人浏览过

|

来源于php中文网

原创

使用Pandas根据中位数绝对离差(MAD)选择DataFrame高变异性列

本文详细介绍了如何利用pandas库,通过计算每列的中位数绝对离差(mad),从大型数据框中高效筛选出具有最高变异性的指定数量的列。mad作为一种稳健的离散度度量,特别适用于处理含有异常值的数据,本教程将提供具体的代码实现和步骤解析。

在数据分析和特征工程中,我们经常需要从包含大量特征(列)的数据集中识别出最具信息量或变异性的特征。当数据集规模庞大,例如包含数万列时,手动检查或基于简单统计量(如标准差)进行筛选可能效率低下或不够稳健。本文将重点介绍如何使用中位数绝对离差(Median Absolute Deviation, MAD)这一稳健的统计量,结合Pandas库的功能,高效地从DataFrame中选择具有最高MAD值的列。

理解中位数绝对离差 (MAD)

中位数绝对离差(MAD)是衡量数据离散程度的一种稳健统计量。与标准差(Standard Deviation)不同,MAD对异常值不敏感,因为它基于中位数而不是均值。其计算步骤如下:

  1. 计算数据集中所有观测值的中位数(median)。
  2. 计算每个观测值与该中位数之间的绝对差值
  3. 计算这些绝对差值的中位数

MAD的数学表达式为:$MAD = \text{median}(|X_i - \text{median}(X)|)$。当数据中存在异常值时,MAD能更准确地反映数据的集中趋势和离散程度,因为它不会被极端值过度拉伸。

筛选高MAD列的实现步骤

假设我们有一个大型的Pandas DataFrame,其中包含大量的列(例如20,000列),每列都包含数值数据。我们的目标是从中选出MAD值最高的N列,生成一个新的DataFrame。以下是实现这一目标的具体步骤和相应的Python代码。

1. 准备示例数据

首先,我们创建一个模拟的DataFrame,以演示整个过程。这个DataFrame将有1000行和20000列,每列包含0到1之间的随机数。

import pandas as pd
import numpy as np

# 为了结果可复现,设置随机种子
rng = np.random.default_rng(seed=2024)
# 创建一个1000行,20000列的DataFrame
df = pd.DataFrame(rng.random((1000, 20000)))

print("原始DataFrame的形状:", df.shape)
print("原始DataFrame的前5行:\n", df.head())

输出示例:

原始DataFrame的形状: (1000, 20000)
原始DataFrame的前5行:
          0         1         2         3  ...     19996     19997     19998     19999
0  0.675831  0.214323  0.309452  0.799466  ...  0.876652  0.417957  0.302618  0.033723
1  0.165503  0.609271  0.840614  0.850995  ...  0.691652  0.327852  0.802473  0.680307
2  0.072913  0.244916  0.382106  0.403751  ...  0.310791  0.631182  0.103423  0.449572
3  0.430460  0.434423  0.130567  0.626203  ...  0.192436  0.017470  0.723502  0.482124124
4  0.841660  0.838981  0.018308  0.298541  ...  0.347722  0.914452  0.551496  0.559643

[5 rows x 20000 columns]

2. 计算每列的MAD

接下来,我们将计算DataFrame中每一列的MAD值。Pandas并没有直接提供df.mad()方法(尽管可以自定义)。我们可以根据MAD的定义手动实现。

无限画
无限画

千库网旗下AI绘画创作平台

下载
# 1. 计算每列的中位数
column_medians = df.median()

# 2. 计算每列中每个值与其对应列中位数的绝对差值
# df.sub(column_medians) 会将df的每一列减去对应列的中位数
# .abs() 计算绝对值
absolute_deviations = df.sub(column_medians).abs()

# 3. 计算这些绝对差值的中位数,即得到每列的MAD
mad_values = absolute_deviations.median()

print("\nMAD值的前10个:\n", mad_values.head(10))

mad_values现在是一个Pandas Series,其索引是原始DataFrame的列名,值是对应列的MAD。

3. 排序MAD值并选择最高N列

现在我们有了每列的MAD值,下一步是根据这些值进行降序排序,并选择前N个列的索引。假设我们要选择MAD最高的1000列。

# 将MAD值按降序排序
sorted_mad = mad_values.sort_values(ascending=False)

# 选择MAD值最高的1000列的索引(列名)
# 如果需要选择不同的数量,只需修改head()中的参数
top_n_cols_indices = sorted_mad.head(1000).index

print(f"\nMAD最高的1000列的索引(前10个示例):\n {top_n_cols_indices[:10]}")

4. 构建新的DataFrame

最后一步是使用筛选出的列索引,从原始DataFrame中选择这些列,从而创建新的DataFrame。

# 使用筛选出的列索引构建新的DataFrame
df_selected_by_mad = df[top_n_cols_indices]

print(f"\n新DataFrame的形状: {df_selected_by_mad.shape}")
print("新DataFrame的前5行:\n", df_selected_by_mad.head())

输出示例:

新DataFrame的形状: (1000, 1000)
新DataFrame的前5行:
          4482      7833     10371      3059  ...      3509      1381     16339     13624
0    0.402850  0.343102  0.031398  0.512106  ...  0.243998  0.545462  0.607359  0.045264
1    0.166466  0.421302  0.763680  0.470844  ...  0.974354  0.719405  0.063957  0.206610
2    0.110333  0.384587  0.605379  0.700797  ...  0.440506  0.080930  0.795212  0.739654
3    0.796290  0.111921  0.006973  0.032487  ...  0.635054  0.084994  0.880535  0.953851
4    0.292507  0.397712  0.077202  0.344962  ...  0.096461  0.541819  0.640090  0.328734

[5 rows x 1000 columns]

完整代码示例

将上述步骤整合,可以得到一个简洁高效的函数:

import pandas as pd
import numpy as np

def select_top_n_cols_by_mad(dataframe: pd.DataFrame, n_cols: int) -> pd.DataFrame:
    """
    根据中位数绝对离差(MAD)从DataFrame中选择变异性最高的N列。

    参数:
        dataframe (pd.DataFrame): 原始DataFrame。
        n_cols (int): 希望选择的列的数量。

    返回:
        pd.DataFrame: 包含MAD值最高的N列的新DataFrame。
    """
    if not isinstance(dataframe, pd.DataFrame):
        raise TypeError("输入必须是Pandas DataFrame。")
    if not isinstance(n_cols, int) or n_cols <= 0:
        raise ValueError("n_cols 必须是正整数。")
    if n_cols > dataframe.shape[1]:
        print(f"警告: 请求的列数 {n_cols} 大于DataFrame的总列数 {dataframe.shape[1]},将返回所有列。")
        return dataframe.copy()

    # 计算每列的MAD
    # df.sub(df.median()) 计算每个元素与所在列中位数的差值
    # .abs() 取绝对值
    # .median() 计算这些绝对差值的中位数,即为MAD
    mad_values = dataframe.sub(dataframe.median()).abs().median()

    # 将MAD值按降序排序,并获取前N个列的索引
    top_n_cols_indices = mad_values.sort_values(ascending=False).head(n_cols).index

    # 根据索引选择列,构建新的DataFrame
    df_selected = dataframe[top_n_cols_indices]

    return df_selected

# 最小工作示例 (Minimal Working Example)
if __name__ == "__main__":
    # 创建一个包含20000列和1000行的随机DataFrame
    rng = np.random.default_rng(seed=2024)
    df_large = pd.DataFrame(rng.random((1000, 20000)))

    print("原始DataFrame的形状:", df_large.shape)

    # 选择MAD最高的1000列
    selected_df = select_top_n_cols_by_mad(df_large, 1000)

    print("\n根据MAD选择后的DataFrame形状:", selected_df.shape)
    print("根据MAD选择后的DataFrame前5行:\n", selected_df.head())

    # 尝试选择超过总列数的列
    selected_all_df = select_top_n_cols_by_mad(df_large, 25000)
    print("\n尝试选择超过总列数的DataFrame形状:", selected_all_df.shape)

注意事项与总结

  • 性能优化: 对于极大的DataFrame,上述Pandas操作通常是高效的,因为它们是高度优化的C语言实现。
  • MAD与标准差: 选择MAD还是标准差取决于数据特性。如果数据中存在或怀疑存在异常值,MAD是更稳健的选择。如果数据分布接近正态且没有明显异常值,标准差也是一个合理的离散度度量。
  • 列的类型: 确保DataFrame中的列是数值类型,否则计算中位数和绝对差值可能会出错。
  • 选择数量: n_cols参数可以根据实际需求进行调整,以筛选出不同数量的“最重要”列。
  • 应用场景: 这种方法在特征选择、降维预处理、以及识别数据集中最具波动性的变量时非常有用,尤其是在金融、生物信息学等领域。

通过上述方法,我们可以有效地利用Pandas和中位数绝对离差,从大规模数据集中筛选出最具变异性的特征,为后续的数据分析和模型构建提供更精炼、更稳健的数据基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

410

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

638

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

362

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

263

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

631

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

671

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

618

2023.09.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号