【问题标题】:How to count patterns in each row separately in a dataframe in Python如何在Python的数据框中分别计算每一行中的模式
【发布时间】:2018-12-23 16:37:24
【问题描述】:

我正在查看长度为 4 的序列中 0 和 1 的所有可能组合。因此,我在数据帧或列表中有 2^4 行。 (我不介意格式,只要可以单独查看每个组合即可)。在这些组合中,我正在寻找特定的 重叠 模式。

patterns=["00","101","1100"] 

因此,在“0000”的第一个组合中,我希望 Python 告诉我它发现了 3 个事件(我不在乎这三个事件中的哪一个)。 我找到了像 search() 这样的函数,但它们只给出了 all 16 种组合的模式总数,而不是单独给出每个组合。另外,我无法适应正确的数据风格。已经尝试过 str.count() 但即使将数据框转换为字符串后,似乎也对我不起作用。
我能想到的最好的方法是:

import itertools
sequ=[x for x in itertools.product(states,repeat=n)] #generates all the 
possible seq-s of the variable
from re import finditer
patterns=["00","101","1100"]
for match in finditer(patterns, sequ):
print(match.span())

但是,这仅适用于简单的模式,例如,patterns=["00"]

【问题讨论】:

  • 向我们展示一个示例输入和输出。从您在此处发布的内容中很难弄清楚您想要什么。
  • 这个描述很难理解。显示数据和预期的输出,然后描述您希望如何从数据到输出。
  • (当你显示数据时,创建一个minimal reproducible example,而不是一个包含数千行的数据框。)
  • 很抱歉,您的问题不清楚。另外,为什么这被标记为“数据框”?你在任何地方都使用熊猫吗?

标签: python list dataframe count pattern-matching


【解决方案1】:
def main():
    n = int(input("Enter number of digits: "))
    for i in range(0, 1<<n):
        gray=i^(i>>1)
        print ("{:0{}b}".format(gray,n))

main()

#Input: 4
#Output:
#0000
#0001
#0011
#0010
#0110
#0111
#0101
#0100
#1100
#1101
#1111
#1110
#1010
#1011
#1001
#1000

我想这就是你要找的。
无需为此使用数据框。有点颠倒了

编辑:

def graylist(n):
    outlist = []
    for i in range(0, 1<<n):
        gray=i^(i>>1)
#        print ("{:0{}b}".format(gray,n))
        outlist.append('{:0{}b}'.format(gray,n))
    return outlist

alist = graylist(4)

def countingpattern(alist, string):

    count = 0
    for item in alist:
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
    return count

print (countingpattern(alist, '00')) #12
print (countingpattern(alist, '101')) #4
print (countingpattern(alist, '1100')) #1

要查看所有模式,我们可以将结果放入字典中。

def countingpatterndict(alist, string):
    adict = {}
    for item in alist:
        count = 0
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
            adict[item] = count
    return adict

print (countingpatterndict(alist, '00')) 
#'0000': 3, '0001': 2, '0011': 1, '0010': 1, ...
print (countingpatterndict(alist, '101'))
#'1110': 0, '1010': 1, '1011': 1, ...
print (countingpatterndict(alist, '111'))
#'1101': 0, '1111': 2, '1110': 1, ...

进一步编辑:

def graylist(n):
    outlist = []
    for i in range(0, 1<<n):
        gray=i^(i>>1)
        outlist.append('{:0{}b}'.format(gray,n))
    return outlist

def countingpatterndict(alist, string):
    adict = {}
    for item in alist:
        count = 0
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
            adict[item] = count
    return adict

alist = graylist(20)
import time
import pandas as pd
z1 = time.clock()
df = pd.DataFrame.from_dict(countingpatterndict(alist, '101'), orient='index')
z2 = time.clock() - z1
print (z2) #5.716345938402242 seconds
print (df)
df.to_csv('result.csv')

【讨论】:

  • 感谢您。我实际上可以做到这一点,但我不能计算模式。我在提供的代码的前两行中得到了你的输出。
  • @Lola 那么你到底想要什么?您能否在问题中提供示例输入和预期输出?
  • 我想要一个向量,它的条目会给我每行匹配多少模式的计数(每行都是一个四位数的组合,就像你的输出一样)。因此,一个长度为 16 的向量。例如,对于这个向量中的前两个条目,我希望看到 (3,2,...)。即,在组合“0000”中计算出三种模式,在“0001”中计算出两种模式。让我知道是否仍然没有意义。 =)
  • 输入正是您在代码中的输出。
  • @Lola 我已经编辑了答案。这应该对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多