我有两个非常大的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次值,如果此条件不为真,则组合前一个值的出现次数,如果此条件正确,将为组合值给出相同的比率.例如,对于上面的列表,我想创建一个如下所示的Series:
0 : 7/6=1.166
1 : 9/6 = 1.5
2 : 9/6 = 1.5
3 : 9/6 = 1.5
.
.
.
100 : some_number
Olivier Mela..
6
您可以使用a 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
作为mentionned你的问题.
请注意,我没有用前一个值的比例填充空槽.除非你有一个非常具体的用例需要它,我建议你不要这样做,因为这会将实际数据与外推数据混合在一起.最好在找不到前一个值时默认,但不污染实际数据.
1> Olivier Mela..:
您可以使用a 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
作为mentionned你的问题.
请注意,我没有用前一个值的比例填充空槽.除非你有一个非常具体的用例需要它,我建议你不要这样做,因为这会将实际数据与外推数据混合在一起.最好在找不到前一个值时默认,但不污染实际数据.