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' 关于我哪里出错的任何想法?
干杯,布兰登
答案 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()))