python - 有效地计算大型 python 列表中的项目

标签 python algorithm pandas list

我有两个非常大的 python 列表,如下所示:

List A: [0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,4.........]
List B: [0,0,0,0,0,0,2,2,2,2,3,3,4,4.........]

这些列表包含非常大的数字,但我指定了一个最大值,比如 100,之后我可以丢弃其余的。

现在我需要计算每个值 (0,1,2..100) 的比率:列表 A 中的出现次数/列表 B 中的出现次数。而且由于这个值并不总是可能的,所以我决定仅当每个列表中的值出现次数超过 5 次时才计算此值,如果此条件不成立,则合并先前值的出现次数,如果此条件,将为合并值给出相同的比率是正确的。 例如,对于上面的列表,我想创建一个如下所示的系列:

0 : 7/6=1.166 
1 : 9/6 = 1.5
2 : 9/6 = 1.5
3 : 9/6 = 1.5
.
.
.
100 : some_number

最佳答案

您可以使用Counter 来计算出现的次数,并使用takewhile 来满足您在100 时停止的要求。

不要丢弃不在列表 b 中的值,请注意我是如何使用 nan 的。

from collections import Counter
from itertools import takewhile

def get_ratios(a, b, max_=None, min_count=0):
    if max_ is not None:
        a = takewhile(lambda x: x <= max_, a)
        b = takewhile(lambda x: x <= max_, b)

    count_a, count_b = Counter(a), Counter(b)

    return {k: float('nan') if not count_b[k] else count_a[k] / count_b[k]
            for k in set(count_a) | set(count_b)
            if count_a[k] >= min_count <= count_b[k]}

例子

a = [1, 1, 1, 2, 3, 101]
b = [1, 1, 2, 2, 4, 101]

print(get_ratios(a, b, max_=100))

输出

{ 1: 1.5,
  2: 0.5,
  3: nan,
  4: 0.0 }

要忽略一些表示不足的值,您可以将 min_count 设置为 5,如您的问题中所述。

请注意,我没有用先前值的比率填充空槽。除非您有非常具体的用例需要它,否则我建议您不要这样做,因为这会将实际 数据与推断 数据混合。找不到的时候还是默认之前的值比较好,但是不要污染实际的数据。

关于python - 有效地计算大型 python 列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203775/

相关文章:

python - 扩展切片 numpy 数组的步骤

python - Python中的循环列表迭代器

python - 将 Twisted 的 @inlineCallbacks 与 Tornado 的 @gen.engine 结合使用

pandas - Seaborn:如何在绘图 X 轴中的每个值后面添加 "%"符号,而不是将值转换为百分比?

python - Pandas :根据特定列的值计数选择行

python - 有没有办法对 scipy.sparse 矩阵进行快速 bool 运算?

python - 如何使用预测模型 python 预测列中的特定行?

python mmap 正则表达式在两个文件中搜索公共(public)条目

c++ - 迭代器范围删除元素

python - 奇怪的 Pandas.read_html 错误