Python统计最频繁的事件

Python统计最频繁的事件,python,pandas,count,frequency,frequency-analysis,Python,Pandas,Count,Frequency,Frequency Analysis,这是我的示例数据框,其中包含有关订单的数据: import pandas as pd my_dict = { 'status' : ["a", "b", "c", "d", "a","a", "d"], 'city' : ["London","Berlin","Paris", "Berlin", "Boston", "Paris", "Boston"], 'components': ["a01, a02, b01, b07, b08, с03, d07, e05,

这是我的示例数据框,其中包含有关订单的数据:

import pandas as pd
my_dict = { 
     'status' : ["a", "b", "c", "d", "a","a", "d"],
     'city' : ["London","Berlin","Paris", "Berlin", "Boston", "Paris", "Boston"],
     'components': ["a01, a02, b01, b07, b08, с03, d07, e05, e06", 
                    "a01, b02, b35, b68, с43, d02, d07, e04, e05, e08", 
                    "a02, a05, b08, с03, d02, d06, e04, e05, e06", 
                    "a03, a26, a28, a53, b08, с03, d02, f01, f24", 
                    "a01, a28, a46, b37, с43, d06, e04, e05, f02", 
                    "a02, a05, b35, b68, с43, d02, d07, e04, e05, e08", 
                    "a02, a03, b08, b68, с43, d06, d07, e04, e05, e08"]
}
df = pd.DataFrame(my_dict)
df

我需要计算最频繁的次数:

  • 订单中的前n个共现组件
  • 前n个最常见的组件(无论是否同时出现)
  • 最好的方法是什么


    我也能看到与市场篮子分析问题的关系,但不确定如何做。

    @ScottBoston的回答显示了实现这一点的矢量化(因此可能更快)方法

    顶部出现

    from collections import Counter
    from itertools import chain
    
    n = 3
    individual_components = chain.from_iterable(df['components'].str.split(', '))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [('e05', 6), ('e04', 5), ('a02', 4)]
    

    Top-n共现

    from collections import Counter
    from itertools import chain
    
    n = 3
    individual_components = chain.from_iterable(df['components'].str.split(', '))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [('e05', 6), ('e04', 5), ('a02', 4)]
    
    注意,我使用了两次
    n
    ,一次用于“共现的大小”,一次用于“top-n”部分。显然,您可以使用两个不同的变量

    from collections import Counter
    from itertools import combinations
    
    n = 3
    individual_components = []
    for components in df['components']:
        order_components = sorted(components.split(', '))
        individual_components.extend(combinations(order_components, n))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [(('e04', 'e05', 'с43'), 4), (('a02', 'b08', 'e05'), 3), (('a02', 'd07', 'e05'), 3)]
    

    @ScottBoston的回答显示了实现这一点的矢量化(因此可能更快)方法

    顶部出现

    from collections import Counter
    from itertools import chain
    
    n = 3
    individual_components = chain.from_iterable(df['components'].str.split(', '))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [('e05', 6), ('e04', 5), ('a02', 4)]
    

    Top-n共现

    from collections import Counter
    from itertools import chain
    
    n = 3
    individual_components = chain.from_iterable(df['components'].str.split(', '))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [('e05', 6), ('e04', 5), ('a02', 4)]
    
    注意,我使用了两次
    n
    ,一次用于“共现的大小”,一次用于“top-n”部分。显然,您可以使用两个不同的变量

    from collections import Counter
    from itertools import combinations
    
    n = 3
    individual_components = []
    for components in df['components']:
        order_components = sorted(components.split(', '))
        individual_components.extend(combinations(order_components, n))
    counter = Counter(individual_components)
    print(counter.most_common(n))
    # [(('e04', 'e05', 'с43'), 4), (('a02', 'b08', 'e05'), 3), (('a02', 'd07', 'e05'), 3)]
    
    下面是一些做同样事情的“熊猫”方式:

    要获得前三个组件

    #Using list comprehension usually faster than .str accessor in pandas
    pd.concat([pd.Series(i.split(',')) for i in df.components]).value_counts().head(3)
    #OR using "pure" pandas methods
    df.components.str.split(',', expand=True).stack().value_counts().head(3)
    
    输出:

     e05    6
     e04    5
     d02    4
    dtype: int64
    
    ( с43,  e04,  e05)    4
    (a02,  e04,  e05)     3
    ( с43,  d07,  e05)    3
    dtype: int64
    
    下一个查找队列,共报告3个组分n=3:

    from itertools import combinations
    n=3
    pd.concat([pd.Series(list(combinations(i.split(','), n))) for i in df.components])\
      .value_counts().head(3)
    
    输出:

     e05    6
     e04    5
     d02    4
    dtype: int64
    
    ( с43,  e04,  e05)    4
    (a02,  e04,  e05)     3
    ( с43,  d07,  e05)    3
    dtype: int64
    
    下面是一些做同样事情的“熊猫”方式:

    要获得前三个组件

    #Using list comprehension usually faster than .str accessor in pandas
    pd.concat([pd.Series(i.split(',')) for i in df.components]).value_counts().head(3)
    #OR using "pure" pandas methods
    df.components.str.split(',', expand=True).stack().value_counts().head(3)
    
    输出:

     e05    6
     e04    5
     d02    4
    dtype: int64
    
    ( с43,  e04,  e05)    4
    (a02,  e04,  e05)     3
    ( с43,  d07,  e05)    3
    dtype: int64
    
    下一个查找队列,共报告3个组分n=3:

    from itertools import combinations
    n=3
    pd.concat([pd.Series(list(combinations(i.split(','), n))) for i in df.components])\
      .value_counts().head(3)
    
    输出:

     e05    6
     e04    5
     d02    4
    dtype: int64
    
    ( с43,  e04,  e05)    4
    (a02,  e04,  e05)     3
    ( с43,  d07,  e05)    3
    dtype: int64
    

    请添加您的预期输出。到目前为止,这有点模棱两可。你想要一个每行中最频繁的元素的新列吗?我希望是这样的:1)3个最常见的共现成分是:a01、b02、C032)3个最常见的成分是a01、a02、e08为什么
    a01
    a02
    e08
    ?我认为
    e05
    (6次)、
    e04
    (5次)和
    b04
    (4次)是最重要的3次,谢谢。没有计算这些,只是输出的一个例子。我认为我应该把它们分成一个列表,以某种方式计算每种成分的出现频率和n种成分的共现频率,但我做不好。请添加您的预期输出。到目前为止,这有点模棱两可。你想要一个每行中最频繁的元素的新列吗?我希望是这样的:1)3个最常见的共现成分是:a01、b02、C032)3个最常见的成分是a01、a02、e08为什么
    a01
    a02
    e08
    ?我认为
    e05
    (6次)、
    e04
    (5次)和
    b04
    (4次)是最重要的3次,谢谢。没有计算这些,只是输出的一个例子。我认为我应该将它们拆分成一个列表,并以某种方式计算每种成分的出现频率和n种成分的共现频率,但无法正确计算。您是否也看到了计算前n种共现频率的方法?@Pinkythemouse请提供实际的预期输出。我是否需要导入一些东西来使用“计数器”?@Pinkythemouse查看两个用例的更新答案与您的答案一样@DeepSpace+1刚刚提供了更多的“熊猫”方法。您是否也看到了计算前n名共现的方法?@Pinkythemouse请提供实际的预期输出。我是否需要导入一些东西来使用“计数器”?@Pinkythemouse查看两个用例的更新答案我喜欢您的答案@DeepSpace+我只是提供了更多的“熊猫”方式。