Pandas如何按位置选取列并按值筛选对应行?
按未知列名的指定位置列筛选DataFrame行
假设你有如下DataFrame,其中某一位置的列名是不确定的(比如示例中位置为2的列,可能是HasCar、IsStaff或其他名称),需要筛选该列值为1的所有行:
import pandas as pd xx = pd.DataFrame([{'ID':1, 'Name': 'Abe', 'HasCar':1}, {'ID':2, 'Name': 'Ben', 'HasCar':0}, {'ID':3, 'Name': 'Cat', 'HasCar':1}])
问题原因
你之前尝试用xx.iloc[:,[2]] == 1得到布尔DataFrame,再用来索引时出现大量NaN,是因为单列DataFrame做布尔索引时,Pandas会按列名匹配,只有目标列会保留符合条件的值,其他列因无匹配布尔列而填充NaN。而xx['HasCar']返回的是Series,布尔索引会直接匹配行,所以能得到正确结果。
解决方法
方法1:直接获取单列Series(推荐)
使用iloc[:, 2](不带内层方括号)直接取位置为2的列,返回Series,再做布尔索引:
# 筛选位置为2的列值为1的行 filtered_df = xx[xx.iloc[:, 2] == 1]
执行结果:
ID Name HasCar 0 1 Abe 1 2 3 Cat 1
方法2:将单列DataFrame转为Series
如果已经得到单列DataFrame,可以用squeeze()方法将其转为Series:
target_col = xx.iloc[:, [2]].squeeze() filtered_df = xx[target_col == 1]
方法3:提取numpy数组做索引
通过.values获取底层numpy数组,展平后做布尔索引:
filtered_df = xx[xx.iloc[:, [2]].values.flatten() == 1]
内容的提问来源于stack exchange,提问作者RedM
相关产品推荐
相关产品推荐

