【发布时间】:2019-06-01 15:48:49
【问题描述】:
我正在尝试使用布尔数组来对数据框进行子集化。这有效:
df = pd.DataFrame(
[
(0, 0, 1),
(0, 1, 2),
(0, 3, 20),
(1, 0, 2),
(1, 1, 1),
(1, 2, 30),
],
columns = ['s', 'j', 'q']
)
df[df['j'] == 0]
df.loc[df['j'] == 0]
但是,以下失败:
df.set_index('s')[df['j'] == 0]
df.set_index('s').loc[df['j'] == 0]
我得到 s 的每个实例都等于 0,而不是 j。我求助于查询(我的情况比字面上的j == 0更复杂,或者我会直接使用它):
df['sub'] = (df['j'] == 0)
df.query('sub')
有没有办法在不创建临时变量的情况下做到这一点?非常感谢! Python 3.7 和熊猫 0.23.4
编辑
我所做的问题是布尔系列和数据框具有不同的索引。下面的答案详细说明了解决它的几种方法,但我支持这两种方法中的任何一种:
df.set_index('s')[(df['j'] == 0).values]
或
df.set_index('s', inplace = True)
df[df['j'] == 0]
【问题讨论】:
-
df.set_index('s')的目的是什么?您当前的解决方案似乎没有使用s作为索引,也不需要它。 -
@jpp 正如大多数人可能猜到的那样,在我无缘无故地对数据进行子集之后,我的代码并没有结束......
标签: python python-3.x pandas boolean