如何在 pandas 数据框中找到值对和三元组

问题描述 投票:0回答:1

我有一个 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

这是对于每个分类值,其中包含的无序对和三元组。

python pandas dataframe dataset series
1个回答
0
投票

确切的逻辑并不完全清楚,但您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.