python3 计数器还对滑动窗口中的索引位置进行平均

标签 python python-3.x data-structures counter

我有一个列表和一个字符串:

anchors=['a','b']
mystring = 'aerdsbewsabsdsasdbs'

我想迭代 mystring 中的每个字母,如果我“击中” anchor ,请跟踪“prior”之前 2 个字母和“post”之后 2 个字母出现的字母。

所以我想要的输出将是一个列表列表,格式为:

[[prior letters, anchor, post letters],
prior letters, anchor, post letters]]

对于每个 anchor 。这可以轻松地使用 mystring 内的 letters 上的 Counter() 来实现,但我想按平均索引对结果输出进行排序位置。
因此,对于每个先前的字母,我想计算它在每个 anchor 的 2 个字母内出现的次数,并按 anchor 的索引位置的平均值进行排序。在我的 anchor “a”示例中,这看起来像:

prior letters = {s:(2,-1), w:(1,-2), d:(1,-2)}
anchor = 'a'
post letters = {e:(1,1), r:(1,2), b:(1,1), s:(2,1.5), d:(1,2)}

其中前字母和后字母的每个键值对的形式为:

letter:(count,avg_index)

letter = 2 滑动窗口内的字母
count = 每个 anchor 的滑动窗口中字母出现的次数
avg_index = 字母相对于每个 anchor 的平均索引位置,例如 (-1.5) 表示字母出现在位置 -1 和 -2,平均值为 -1.5。
我正在努力完成代码,是否有更好的数据结构可以帮助我?

最佳答案

不是完整的答案,但评论太狭窄了。 我测试过这段代码:

import pandas as pd

anchors=['a','b']
mystring = 'aerdsbewsabsdsasdbs'

df = pd.DataFrame(columns=['letter', 'match_anchor', '2_letters_before', '2_letters_afer'])
for letter in mystring:
    df = df.append( pd.DataFrame([[letter, letter in anchors]], columns=['letter', 'match_anchor']) )

df['2_letters_before'] = df['letter'].shift(2)
df['2_letters_afer'] = df['letter'].shift(-2)
df = df[df['match_anchor'] == True]
df = df.reset_index(drop=True)
print(df)

输出是:

  letter match_anchor 2_letters_before 2_letters_afer
0      a         True              NaN              r
1      b         True                d              w
2      a         True                w              s
3      b         True                s              d
4      a         True                d              d
5      b         True                s            NaN

问题是我不理解你的数据。就目前的输出而言,我想我已经接近您的期望了。但是,您能详细解释一下您想要的预期输出吗?例如,数字 (2,-1) 对于字母“s”/ anchor “a”意味着什么?

prior letters = {s:(2,-1), w:(1,-2), d:(1,-2)}
anchor = 'a'
post letters = {e:(1,1), r:(1,2), b:(1,1), s:(2,1.5), d:(1,2)}

编辑: 嗯,不是一个非常Pythonic 的代码,但我已经成功地用pandas 做到了。 第一步:我正在构建一个 DataFrame,其中的字母与窗口内的 anchor + 字母相匹配。 然后,我构建了所有要查找的字母的列表。我确实循环这些字母来计算它们+计算索引。 输出不是字典,但我只打印了值。它可以轻松编辑以满足您的需求。

import pandas as pd
import numpy as np

anchors=['a','b']
mystring = 'aerdsbewsabsdsasdbs'

# Building the DataFrame for calculations:
df = pd.DataFrame(columns=['letter', 'match_anchor'])
for letter in mystring:
    df = df.append( pd.DataFrame([[letter, letter in anchors]], columns=['letter', 'match_anchor']) )

df['2_let_bef'] = df['letter'].shift(2)
df['1_let_bef'] = df['letter'].shift(1)
df['1_let_aft'] = df['letter'].shift(-1)
df['2_let_aft'] = df['letter'].shift(-2)
df = df[df['match_anchor'] == True]
print(df)

# Getting the list of letters to look to:
let = pd.concat([df['2_let_bef'],
                 df['1_let_bef'],
                 df['2_let_aft'],
                 df['1_let_aft'],], ignore_index=True)
let = let.dropna().unique().tolist()
print('list of letters to look to:', let, '\n')

# looping through
for letter in anchors:
    print('\nAnchor=', letter)
    pf_anchor = df[df['letter'] == letter]
    # checking 'before'
    for l in let:
        count = len(pf_anchor[pf_anchor['2_let_bef'] == l]) + \
                len(pf_anchor[pf_anchor['1_let_bef'] == l])
        index_avg = -2*len(pf_anchor[pf_anchor['2_let_bef'] == l]) - \
                    len(pf_anchor[pf_anchor['1_let_bef'] == l])
        if count > 0:
            index_avg = index_avg/count
            print('(before)', l, ":", (count,index_avg))

    for l in let:
    # checking 'after'
        count = len(pf_anchor[pf_anchor['2_let_aft'] == l]) + \
                len(pf_anchor[pf_anchor['1_let_aft'] == l])
        index_avg = 2*len(pf_anchor[pf_anchor['2_let_aft'] == l]) + \
                    len(pf_anchor[pf_anchor['1_let_aft'] == l])
        if count > 0:
            index_avg = index_avg/count
            print('(after)', l, ":", (count,index_avg))

输出:

Anchor= a
(before) d : (1, -2.0)
(before) w : (1, -2.0)
(before) s : (2, -1.0)
(after) d : (1, 2.0)
(after) s : (2, 1.5)
(after) r : (1, 2.0)
(after) e : (1, 1.0)
(after) b : (1, 1.0)

Anchor= b
(before) d : (2, -1.5)
(before) s : (3, -1.6666666666666667)
(before) a : (1, -1.0)
(after) d : (1, 2.0)
(after) w : (1, 2.0)
(after) s : (2, 1.0)
(after) e : (1, 1.0)

关于python3 计数器还对滑动窗口中的索引位置进行平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61738013/

相关文章:

java - 不确定选择哪种类型的列表?

.net - 将 C 数据结构和 typedef 映射到 .Net

java - pyspark 无法识别 spark.read.load() 中 1989Dec31 和 31Dec1989 等日期的 MMM dateFormat 模式

python - 将数据保存到pandas中的多个csv文件中

Python 3 - pickle 可以处理大于 4GB 的字节对象吗?

python-3.x - TensorFlow 2.0 中 lambda 函数的组成

python - matplotlib 事件监听器在 PyQT 小部件中不起作用

python - 如何从 OpenCV 中已标记的图像中获取区域属性?

python - 将 python 字符串转换为不带逗号的整数

algorithm - 高效的群组成员时间点查询