如何在没有copy / reset_index操作的情况下根据索引进行切片?

时间:2013-02-08 23:33:24

标签: python pandas

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

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])

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

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

2 个答案:

答案 0 :(得分:1)

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

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

注意:如果IndexError没有18行,则会抛出a

请参阅indexing section of the docs

答案 1 :(得分: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

<强>更新

好的,那么boolean索引索引然后将其传递给.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