在DataFrame中根据行的条件选择列

6

我想根据另一个数据框架生成一个数据框(或序列),根据另一个序列使用不同的列选择第一个框架中的数据。在下面的简化示例中,我想要前三行使用“a”列作为frame1的值,“picked_values”序列中的最后两行使用“b”列。

frame1=pd.DataFrame(np.random.randn(10).reshape(5,2),index=range(5),columns=['a','b'])
picked_values=pd.Series(['a','a','a','b','b'])

框架1

    a           b
0   0.283519    1.462209
1   -0.352342   1.254098
2   0.731701    0.236017
3   0.022217    -1.469342
4   0.386000    -0.706614

尝试进入系列:

0   0.283519
1   -0.352342
2   0.731701
3   -1.469342
4   -0.706614

我原本希望使用values[picked_values]来实现,但这只会得到五列。

在实际例子中,picked_values要大得多且需要进行计算。

感谢您的时间。

2个回答

6
使用 df.lookup
pd.Series(frame1.lookup(picked_values.index,picked_values))

0    0.283519
1   -0.352342
2    0.731701
3   -1.469342
4   -0.706614
dtype: float64

2
这就是为什么Stack Overflow是最好的。谢谢! - TheSuperbard

3
以下是使用NumPy的基于整数索引和Series.searchsorted方法的方法:

这里是一个基于NumPy的方法,使用整数索引Series.searchsorted方法:

frame1.values[frame1.index, frame1.columns.searchsorted(picked_values.values)]
# array([0.22095278, 0.86200616, 1.88047197, 0.49816937, 0.10962954])

2
我在想为什么这个输出不同,后来意识到这个样本是随机的。 - anky
2
可以的 :) 如果坚持使用生成的代码,会让事情变得不那么混乱 @anky - yatu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接