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
我需要计算最频繁的次数:
我也能看到与市场篮子分析问题的关系,但不确定如何做。@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+我只是提供了更多的“熊猫”方式。