如何使用Pandas删除名称含PP且值≤price的列?
解决方案
步骤拆解
要实现需求,核心是分两类筛选列:
- 强制保留不含"PP"的列(
price、highPrice、lowPrice) - 保留名称含"PP"但列值**不小于等于
price**的列(示例中PP_5等于price也被保留,所以判断条件为>=)
代码实现
先构造示例DataFrame:
import pandas as pd data = { 'price': [1.1], 'highPrice': [1.2], 'lowPrice': [1.0], 'PP_1': [0.1], 'PP_2': [0.2], 'PP_3': [0.3], 'PP_4': [0.8], 'PP_5': [1.1], 'PP_6': [1.5], 'PP_7': [2.2] } df = pd.DataFrame(data)
然后执行筛选:
# 1. 提取所有不含PP的列,强制保留 non_pp_cols = [col for col in df.columns if 'PP' not in col] # 2. 提取所有含PP的列,筛选出值 >= price的列 pp_cols = [col for col in df.columns if 'PP' in col] keep_pp_cols = [col for col in pp_cols if df[col].iloc[0] >= df['price'].iloc[0]] # 3. 合并保留列,生成结果 keep_cols = non_pp_cols + keep_pp_cols df_result = df[keep_cols]
输出结果
price highPrice lowPrice PP_5 PP_6 PP_7 0 1.1 1.2 1.0 1.1 1.5 2.2
多行数据适配
如果你的DataFrame有多行,需要根据业务逻辑调整筛选条件:
- 若要求该PP列所有行的值都 >= price才保留:
keep_pp_cols = [col for col in pp_cols if (df[col] >= df['price']).all()] - 若要求该PP列至少有一行的值 >= price就保留:
keep_pp_cols = [col for col in pp_cols if (df[col] >= df['price']).any()]
原代码问题说明
你之前写的df = df[df.filter <= df.price]存在两个问题:
df.filter是DataFrame的方法,不是列对象,不能直接用来做比较- 这种写法是筛选行,而你需要的是筛选列,所以要先确定要保留的列名列表,再用列表索引DataFrame
内容的提问来源于stack exchange,提问作者One boy
相关产品推荐
相关产品推荐

