我有一个用Python语言编写的Pandas 数据帧,其中包含以下两列.

我需要计算在考虑和不考虑顺序的情况下,数据组合的对和三元组出现的次数.例如,假设我有一个包含两列(ClassificationIndividual)和以下令牌数据的数据帧

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来生成Classificationcombinations,然后应用value_countsgroupby.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

Python相关问答推荐

Pandas使用过滤器映射多列

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

如何使用PyTest根据self 模拟具有副作用的属性

基本链合同的地址是如何计算的?

Google Drive API获取文件计量数据

有条件地采样我的大型DF的最有效方法

跟踪我已从数组中 Select 的样本的最有效方法

使用GEKKO在简单DTE系统中进行一致初始化

多处理代码在while循环中不工作

Python会扔掉未使用的表情吗?

@Property方法上的inspect.getmembers出现意外行为,引发异常

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

Pandas DataFrame中行之间的差异

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

如何并行化/加速并行numba代码?

Django RawSQL注释字段

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

dask无groupby(ddf. agg([min,max])?''''

网格基于1.Y轴与2.x轴显示在matplotlib中

如何使用使用来自其他列的值的公式更新一个rabrame列?