我有一个 Python 中的 pandas 数据框,其中包含以下两列。
我需要计算在考虑和不考虑顺序的情况下数据组合对和三元组出现的次数。举个例子,假设我有一个包含两列的数据框,
Classification
和Individual
以及以下令牌数据
data = {
'Classification': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5],
'Individual': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'C', 'C', 'C', 'A', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'B', 'B', 'B']
}
现在,我想得到以下结果
Clasification ValueSeries TimesClassification PercentageClassification
1 AB 5 1
2 AB 5 1
3 AC 2 0.4
3 AB 5 1
3 ABC 3 0.6
4 AB 5 1
4 BC 2 0.4
4 ABC 3 0.6
5 AC 2 0.4
5 AB 5 1
5 ABC 3 0.6
这是对于每个分类值,其中包含的无序对和三元组。
itertools
生成 combinations
的 Classification
,然后应用 value_counts
和 groupby.transform
来计算计数:
from itertools import chain, combinations
def powerset(s):
s = set(s)
return list(chain.from_iterable(combinations(s, r)
for r in range(2, len(s)+1))
)
out = df.groupby('Classification')['Individual'].agg(powerset).explode()
out = (out
.reset_index(name='ValueSeries')
.merge(out.value_counts().rename('TimesClassification'),
how='left',
left_on='ValueSeries', right_index=True)
.assign(PercentageClassification=lambda d: d['TimesClassification']
/ d.groupby('Classification')['TimesClassification'].transform('max')
)
)
输出:
Classification ValueSeries TimesClassification PercentageClassification
0 1 (A, B) 5 1.0
1 2 (A, B) 5 1.0
2 3 (C, A) 3 0.6
3 3 (C, B) 3 0.6
4 3 (A, B) 5 1.0
5 3 (C, A, B) 3 0.6
6 4 (C, A) 3 0.6
7 4 (C, B) 3 0.6
8 4 (A, B) 5 1.0
9 4 (C, A, B) 3 0.6
10 5 (C, A) 3 0.6
11 5 (C, B) 3 0.6
12 5 (A, B) 5 1.0
13 5 (C, A, B) 3 0.6