大熊猫计数值占总数的50%

时间:2017-07-27 15:30:44

标签: python pandas

maven-pmd-plugin

我想要做的是计算百分比列中总和为50%的值的数量。唯一的条件是价格列必须按降序排序。在提供的样本数据中,正确的输出为2。

最初我正在考虑使用带有计数的条件,但是我达到了死胡同。

test={'price':[1,3,4,2,1,2,1,6]}
test=pd.DataFrame(test)
test=test.sort_values('price', ascending=False)
sum_test=test.sum()
test['percentage']=(test/sum_test)*100

但是,我收到以下错误:     ' numpy.int32'对象没有属性' where' 关于我哪里出错的任何想法?

干杯,布兰登

2 个答案:

答案 0 :(得分:2)

如果你想计算你需要多少行才能达到50%,这将完成这项工作:

np.sum(test['percentage'].cumsum()<=50)

这将给你2.注意

test['percentage'].cumsum()

给出

7     30.0
2     50.0
1     65.0
3     75.0
5     85.0
0     90.0
4     95.0
6    100.0
Name: percentage, dtype: float64

因此上述结果是百分比的累计总和。然后你可以计算它们中有多少小于50%,这是我答案中的第一行代码。

答案 1 :(得分:0)

即使Miriam Farber(赞成)已经完全回答了这个问题,我也想发布其他选择。看起来它也快得多。

这里是(导出到列表并使用itertools,而不是cumsum)。

import itertools
seq = test['percentage'].tolist()
len(list(itertools.takewhile(lambda x: x <= 50, itertools.accumulate(seq))))

定时两​​个:

%timeit len(list(itertools.takewhile(lambda x: x <= 50, itertools.accumulate(test['percentage'].tolist()))))
#18.3 µs per loop
%timeit np.sum(test['percentage'].cumsum()<=50)
#335 µs per loop

有趣的是,我在这两个操作之间的速度提高了8倍:

%timeit test['percentage'].cumsum()
%timeit list(itertools.accumulate(test['percentage'].tolist()))