如何获取DataFrame中值介于-1到1之间的列名?
问题描述
我用以下代码生成了一个DataFrame:
import numpy as np import pandas as pd random_number_gen = np.random.default_rng() df = pd.DataFrame(random_number_gen.integers(-5, 5, size=(1, 13)), columns=list('ABCDEFGHIJKLM'))
示例数据如下:
| A | B | C | D | E | F | G | H | I | J | K | L | M |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 4 | -4 | -1 | 3 | -5 | -3 | 0 | -4 | -1 | 3 | 2 |
我想获取值介于-1到1之间的列名,尝试了以下代码但没成功:
df.columns[(( -1<= df.any()) & (df.any() <=1)).iloc[0]]
解决方案
你的问题出在df.any()的用法上——any()是判断列中是否存在至少一个满足条件的值,而非直接获取列的数值。由于你的DataFrame只有一行,直接提取这行数据进行判断即可:
方法1:提取行数据后筛选
# 提取唯一的一行数据 row = df.iloc[0] # 筛选出值在[-1,1]区间内的列名 target_cols = row[(row >= -1) & (row <= 1)].index.tolist()
针对示例数据运行后,会得到结果 ['A', 'B', 'E', 'I', 'K'],符合预期。
方法2:链式简化写法
也可以不用单独提取行,直接链式调用完成筛选:
target_cols = df.columns[(df.iloc[0] >= -1) & (df.iloc[0] <= 1)]
原代码失败原因
df.any()返回的是布尔值(每列是否存在至少一个True),用它和数值进行比较会导致逻辑错误,自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者Zen4ttitude
相关产品推荐
相关产品推荐

