【问题标题】:Python Pandas DataFrame, find longest and top recurrent sequences of elementsPython Pandas DataFrame,查找最长和最高循环的元素序列
【发布时间】:2021-01-09 17:24:58
【问题描述】:

我有以下 Pandas 数据框。

import pandas as pd
data = {'id':[1,2,3,4,5,6,7,8,9],
        'chain':[['x','x','L','U','C','K'],
                 ['x','x','D','U','N','E'],
                 ['L','U','C','K','x','x'],
                 ['x','x','D','U','N','E'],
                 ['D','U','N','E','x','x'],
                 ['A','B','C','D','x','x'],
                 ['x','A','B','C','D','x'],
                 ['x','L','U','C','K','x'],
                 ['x','x','D','U','N','E']]}
df=pd.DataFrame.from_records(data)

如何列出 n 个元素的最频繁出现的序列?

对于 n=4,我们会发现:

  • 'D','U','N','E' x5
  • 'L','U','C','K' x4
  • 'A','B','C','D' x2

我已经开始写一个复杂的 FOR 怪物,但我认为一定有更聪明的方法,一个我还没有找到的好 Python 库。

【问题讨论】:

  • 不清楚您要的是什么。
  • 请提供一些预期的输出
  • 什么是n?另外,在您的示例中,您在哪里/如何“找到” 5 DUNE 和 4 LUCK?

标签: python pandas dataframe numpy


【解决方案1】:

使用的数据如下:

data = {'id':[1,2,3,4,5,6,7,8,9],
    'chain':[['A','A','L','U','C','K'],
             ['G','X','D','U','N','E'],
             ['L','U','C','K','X','B'],
             ['A','N','D','U','N','E'],
             ['D','U','N','E','C','P'],
             ['D','X','N','E','C','D'],
             ['C','A','A','A','A','B'],
             ['X','L','U','C','K','E'],
             ['X','A','D','U','N','E']]}
df=pd.DataFrame.from_records(data)

                chain  id
0  [A, A, L, U, C, K]   1
1  [G, X, D, U, N, E]   2
2  [L, U, C, K, X, B]   3
3  [A, N, D, U, N, E]   4
4  [D, U, N, E, C, P]   5
5  [D, X, N, E, C, D]   6
6  [C, A, A, A, A, B]   7
7  [X, L, U, C, K, E]   8
8  [X, A, D, U, N, E]   9

解决方案:

据我了解,您想要组合,然后计算价值:

from itertools import combinations
n = 4
pd.concat((pd.Series(combinations(i,n)).drop_duplicates() 
                    for i in df['chain'])).value_counts()

(D, U, N, E)    4
(L, U, C, K)    3
(X, D, N, E)    2
(X, D, U, N)    2
(A, U, N, E)    2
               ..
(X, N, E, C)    1
(N, D, U, E)    1
(D, X, E, D)    1
(X, L, K, E)    1
(G, D, U, N)    1
Length: 106, dtype: int64

要获得前 2 个组合,请执行以下操作:

s = pd.concat((pd.Series(combinations(i,n)).drop_duplicates() 
                for i in df['chain'])).value_counts().head(2)
print(s)

(D, U, N, E)    4
(L, U, C, K)    3
dtype: int64

注意,如果你想从元组中获取字符串,你可以','join()

【讨论】:

  • 谢谢,看起来很有希望!它适用于 n=4,但如果我切换到 n=3,它将显示不在数据集中的结果 (D,N,E) 并且 n=5 在计数器中是错误的。
  • @Vincent for n=4 ,你不认为 xDUNxxDU 也会重复 3 次,我们应该考虑它们吗?
【解决方案2】:

我完全不知道这是否是您要查找的内容,但根据您提供的信息和预期输出,我得出了以下结论。

>>> df['chain'].apply(lambda x: ','.join(map(str,x))).replace(r'\,?x\,?','',regex=True).value_counts()


D,U,N,E    4
L,U,C,K    3
A,B,C,D    2

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2011-01-23
    • 2023-02-08
    • 2023-03-30
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多