采用这样的布尔过滤器操作,返回结果数据集的副本:
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])
这可能是对整个数据集(百万行)的大量复制操作,然后是重置操作。
我想在没有复制操作的情况下一步完成。任何评论/见解表示赞赏。
答案 0 :(得分:1)
对此的一个改进是使用iloc
,它只抓取指定整数位置的行:
a = df[(df.age > 20) & (df.age < 30)]
a.iloc[10, 14, 17]
注意:如果IndexError
没有18行,则会抛出a
。
答案 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