Python:根据另一列匹配条件返回对应列的值
根据条件提取对应列的Pandas实现
看起来你是想基于Y列的取值,筛选出X列里的对应值对吧?你的思路是对的,但当前写的代码有点小问题,导致没法得到你想要的结果,我来帮你修正一下~
你的代码问题在哪里?
- 你用
for i in dataset遍历的时候,拿到的是DataFrame的每一行数据,不是索引,所以y[i]这种写法其实是不对的; - 而且
X.iloc[:,0]会直接把整个X列都赋值给x1,没有做任何条件筛选,所以不管Y的值是什么,打印出来的都是全部X值,不是你要的符合Y=1的部分。
正确的实现方式
方法1:用Pandas布尔索引(强烈推荐,简洁又高效)
Pandas本身就提供了非常方便的条件筛选功能,完全不需要手动写for循环,几行代码就能搞定:
先假设你的数据是存在DataFrame里的,比如先构造示例数据:
import pandas as pd # 模拟你的X、Y列数据 dataset = pd.DataFrame({ 'X': [1, 2, 3, 4, 5], 'Y': [0, 1, 1, 0, 1] })
然后直接根据Y的条件筛选X的值:
# 获取Y=1对应的所有X值,转成列表 x_y1 = dataset[dataset['Y'] == 1]['X'].tolist() print(x_y1) # 输出:[2, 3, 5] # 获取Y=0对应的所有X值 x_y0 = dataset[dataset['Y'] == 0]['X'].tolist() print(x_y0) # 输出:[1, 4]
如果你的X和Y是单独的Series对象(比如你代码里的X是单独的列),也可以直接这样写:
x_y1 = X[Y == 1].tolist()
方法2:修正你的for循环(不推荐,数据量大时效率低)
如果你一定要用for循环来实现,得正确遍历行数据或者索引,比如:
x1 = [] # 遍历每一行的索引和对应数据 for idx, row in dataset.iterrows(): if row['Y'] == 1: x1.append(row['X']) print(x1) # 输出:[2, 3, 5]
不过这种方法在数据量比较大的时候,会比布尔索引慢很多,所以优先用方法1哦。
内容的提问来源于stack exchange,提问作者sai kalluri
相关产品推荐
相关产品推荐

