【发布时间】:2018-04-24 03:23:12
【问题描述】:
我有一个给定的数据框,我希望每一行都能够选择高于该行给定百分位数的值。
让我们考虑一下这个数据框:
df = pd.DataFrame({'A' : [5,6,3,4, 0,5,9], 'B' : [1,2,3, 5,7,0,1]})
A B
0 5 1
1 6 2
2 3 3
3 4 5
4 0 7
5 5 0
6 9 1
以及每行第 20 个分位数的给定向量:
rowsQuantiles = df.quantile(0.2, axis=1)
0 1.8
1 2.8
2 3.0
3 4.2
4 1.4
5 1.0
6 2.6
我希望能够为每一行过滤掉低于该行分位数的值以获得以下结果:
quantileMask = df > rowsQuantiles
A B
0 True False
1 True False
2 False False
3 False True
4 False True
5 True False
6 True False
编辑:
我真的很喜欢@andrew_reece 和@Andy Hayden 的这两种方法,所以我决定看看哪一种是最快/最佳实现的:
N=10000000
df = pd.DataFrame({'A' : [random.random() for i in range(N)], 'B' : [random.random() for i in range(N)]})
rowsQuantiles = df.quantile(0.2, axis=1)
t0=time.time()
mask=(df.T>rowsQuantiles).T
#mask=df.apply(lambda row: row > rowsQuantiles)
print(str(time.time()-t0))
结果非常简单(经过多次重复测试):
-
220ms 对于
mask=(df.T>rowsQuantiles).T -
65ms 对于
mask=df.apply(lambda row: row > rowsQuantiles) -
21ms 为
df.gt(rowsQuantiles,0),接受的答案。
【问题讨论】:
-
没有机会,这些都是垃圾时间。请参阅我的回答,我已使用您的数据通过
timeit正确计时。 -
我在你的回答中看到的都是我发布的内容,对吧?
-
您声称您接受的答案是最快的。我说不是。更重要的是,无论出于何种原因,您都对非常好的答案投了反对票。
-
没有注意到
gt的方法,现在已经更正了,抱歉。除此之外,àpply比双转置更快,这就是我的意思是你的帖子与我的一致的原因。不过不会和你玩争论/投反对票的游戏 -
没问题,退回反对票并继续前进要容易得多:)
标签: python pandas filter slice mask