Pandas指定行内比较列值并提取符合条件的列名
实现步骤
1. 提取目标行
你已经掌握df.loc筛选方法的话可以直接使用,也可以用如下写法适配第一列按位置筛选的场景,自动转成一维Series方便后续处理:
# 替换字符串x为你实际的筛选值 target_row = df[df.iloc[:, 0] == 'x'].squeeze()
注:如果筛选结果可能有多行,你可以提前用
df[df.iloc[:, 0] == 'x'].shape[0]确认行数符合唯一行的预期,避免squeeze()转换出错。
2. 提取符合条件的列名
直接对目标行Series做元素级判断,生成布尔掩码后过滤索引即可:
# 替换y为你实际的阈值 # 条件1:值为整数(兼容pandas、numpy内置整数类型) # 条件2:值小于阈值y mask = target_row.apply(lambda val: pd.api.types.is_integer(val) and val < y) # 提取符合条件的列名,转为列表格式 qualified_cols = target_row[mask].index.tolist()
如果你需要筛选出值唯一的单元格对应的列名(即多个列符合条件但值相同时只保留一个),可以调整最后一步为:
qualified_cols = target_row[mask].drop_duplicates().index.tolist()
示例验证
我们用测试数据验证效果:
import pandas as pd # 构造测试DataFrame df = pd.DataFrame([ ['x', 3, 5.5, 12, 'test', -2], ['z', 7, 8, 9, 10, 11] ], columns=['col1', 'col2', 'col3', 'col4', 'col5', 'col6']) y = 10 # 执行操作 target_row = df[df.iloc[:, 0] == 'x'].squeeze() mask = target_row.apply(lambda val: pd.api.types.is_integer(val) and val < y) qualified_cols = target_row[mask].index.tolist() print(qualified_cols)
运行输出为['col2', 'col6'],符合预期。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

