1

采用这样的布尔过滤器操作,它返回结果数据集的副本:

df[(df.age > 20) & (df.age < 30)]. 

现在从结果集中我想根据索引选择一个随机切片。所以例如。我可能想要第 10 行、第 14 行和第 17 行。

但我不能说

df[(df.age > 20) & (df.age < 30) & df.index.isin([10, 14, 17])] 

因为过滤后的索引会不同。我们可以像这样在 3 个语句中轻松做到这一点:

a = df[(df.age > 20) & (df.age < 30)]. 
a = a.reset_index()
result = a.index.isin([10, 14, 17])

这可能是对整个数据集(百万行)的巨大复制操作,然后是重置操作。

我想在没有复制操作的情况下一步完成。任何意见/见解表示赞赏。

4

2 回答 2

1

对此的一项改进是使用iloc,它只抓取指定整数位置的行:

a = df[(df.age > 20) & (df.age < 30)]
a.iloc[10, 14, 17]

注意:这将抛出一个IndexErrorifa没有 18 行。

请参阅文档的索引部分

于 2013-02-09T00:31:21.177 回答
0

只需使用.ix

In [1]: df = DataFrame(np.arange(20).reshape(5,4))

In [2]: df
Out[2]:
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19

在这里,我索引第一列的值小于 12 的数据框,然后用于.ix获取结果的第 0 行和第 2 行:

In [3]: df[df[0] <12].ix[[0,2]]
Out[3]:
   0  1   2   3
0  0  1   2   3
2  8  9  10  11

更新:

好的,布尔索引索引然后将其传递给.ix呢?

In [1]: (df[0] < 12) | (df[0] > 12)
Out[1]:
0     True
1     True
2     True
3    False
4     True
Name: 0

使用上述布尔系列索引 df.index:

In [2]: df.index[(df[0] < 12) | (df[0] > 12)]
Out[2]: Int64Index([0, 1, 2, 4], dtype=int64)

现在,在df.ix[]. 在这里,传递 3 会拉回最初索引的第 4 行:

In [3]: df.ix[df.index[(df[0] < 12) | (df[0] > 12)][3]]
Out[3]:
0    16
1    17
2    18
3    19
Name: 4
于 2013-02-09T02:46:10.740 回答