如何删除pandas DataFrame中方差低于阈值的行?
过滤行方差低于阈值的DataFrame行
没问题,这个需求用Pandas其实很容易实现,只是你之前可能没留意到var()方法可以指定按行计算!我给你一步步演示:
首先先还原你的示例DataFrame:
import pandas as pd data = { 'ID_column': ['ID1', 'ID2', 'ID3'], 'Test1': [0, 4, 3], 'Test2': [1, 2, 1], 'Test3': [3, 0, 3], 'Test4': [0, 0, 5] } df = pd.DataFrame(data).set_index('ID_column')
此时你的DataFrame结构如下:
| ID_column | Test1 | Test2 | Test3 | Test4 |
|---|---|---|---|---|
| ID1 | 0 | 1 | 3 | 0 |
| ID2 | 4 | 2 | 0 | 0 |
| ID3 | 3 | 1 | 3 | 5 |
接下来是核心操作,分三步完成行过滤:
- 按行计算方差:用
df.var(axis=1),这里的axis=1是关键——默认axis=0是按列计算,指定axis=1就会切换为按行统计。 - 设置阈值:定义你要的阈值
x,比如假设x=2。 - 布尔索引过滤:保留方差大于等于阈值的行,或者直接删除低于阈值的行。
具体代码示例:
# 设置你的阈值x x = 2 # 计算每行的样本方差(默认自由度为n-1) row_variances = df.var(axis=1) # 过滤:只保留方差 >= x 的行 filtered_df = df[row_variances >= x]
运行后filtered_df的结果为:
| ID_column | Test1 | Test2 | Test3 | Test4 |
|---|---|---|---|---|
| ID1 | 0 | 1 | 3 | 0 |
| ID2 | 4 | 2 | 0 | 0 |
| ID3 | 3 | 1 | 3 | 5 |
(注:ID1的行方差刚好等于2,所以被保留;如果把阈值设为x=2.1,ID1就会被过滤掉)
如果你的DataFrame里混有非数值列(比如ID_column没设为索引的情况),记得先筛选数值列再计算方差,避免报错:
# 仅对数值型列计算行方差 row_variances = df.select_dtypes(include=['int64', 'float64']).var(axis=1)
内容的提问来源于stack exchange,提问作者LizzAlice
相关产品推荐
相关产品推荐

