在python中基于特定的dataframe列获取组合

在python中基于特定的dataframe列获取组合,python,pandas,combinations,itertools,Python,Pandas,Combinations,Itertools,我有一个包含3列的数据框架:equivalences、class、ch。我使用的是Python equivalences class ch ETICA CONTABIL A ÉTICA CONTÁBIL 40.0 ETICA CON

我有一个包含3列的数据框架:equivalences、class、ch。我使用的是Python

equivalences                             class                                              ch

ETICA CONTABIL                           A ÉTICA CONTÁBIL                                   40.0
ETICA CONTABIL                           A ÉTICA CONTÁBIL COM ENFOQUE                       40.0
BANCO DE DADOS                           GERENCIANDO SEU BD                                 40.0
AMBIENTE WEB                             APLICAÇÕES EM NUVENS                               40.0
AMBIENTE WEB                             ALTA DISPONIBILIDADE                               40.0
TECNOLOGIAS WEB                          PÁGINAS PARA INTERNET                              40.0
TECNOLOGIAS WEB                          PROGRAMAÇÃO WEB AVANÇADA                           40.0
TECNOLOGIAS WEB                          DESENVOLVENDO COM JS                               40.0
None                                     PROGRAMAÇÃO WEB                                    40.0
我需要得到等价的对组合,求这对的ch的和。应该是这样的:

equivalences      class a                   class b                                  ch

ETICA CONTABIL    A ÉTICA CONTÁBIL          A ÉTICA CONTÁBIL COM ENFOQUE            80.0
BANCO DE DADOS    GERENCIANDO SEU BD        (null)                                  40.0
AMBIENTE WEB      APLICAÇÕES EM NUVENS      ALTA DISPONIBILIDADE                    80.0
TECNOLOGIAS WEB   PÁGINAS PARA INTERNET     PROGRAMAÇÃO WEB AVANÇADA                80.0
TECNOLOGIAS WEB   PÁGINAS PARA INTERNET     DESENVOLVENDO COM JS                    80.0
TECNOLOGIAS WEB   PROGRAMAÇÃO WEB AVANÇADA  DESENVOLVENDO COM JS                    80.0
(null)            PROGRAMAÇÃO WEB           (null)                                  40.0

我想我必须使用itertools组合,但我不知道如何通过等价物分组来获得不同的对。 我该怎么做呢?

这里有一个解决方案(为了清楚起见,分几个步骤):


假设
df
是您的数据帧,首先使用
itertools
在一个名为
pairs
的单独数据帧上获取对组合,如下所示:

import itertools

pairs = df.groupby('equivalences', )['class'].unique().to_frame()
func = lambda x: list(itertools.combinations(x, 2)) if len(x) > 1 else x
pairs['combinations'] = pairs['class'].map(func)
然后应用嵌套的for循环输出每个
等价项
对的结果,如下所示:

records = []
for i in pairs.index:
    for j in pairs.loc[i, 'combinations']:
        if isinstance(j, tuple):
            records.append(
                {
                    'equivalences': i,
                    'class a': j[0],
                    'class b': j[1],
                    'ch': df.loc[(df['equivalences'] == i) & (df['class'].isin(j)), 'ch'].sum()
                }
            )
        else:
            records.append(
                {
                    'equivalences': i,
                    'class a': j,
                    'class b': 'null',
                    'ch': df.loc[(df['equivalences'] == i) & (df['class'] == j), 'ch'].sum()
                }
            )
            
    
pd.DataFrame.from_dict(records,)
输出:

    equivalences    class a class b ch
0   AMBIENTE WEB    APLICAÇÕES EM NUVENS    ALTA DISPONIBILIDADE    80
1   BANCO DE DADOS  GERENCIANDO SEU BD  null    40
2   ETICA CONTABIL  A ÉTICA CONTÁBIL    A ÉTICA CONTÁBIL COM ENFOQUE    80
3   TECNOLOGIAS WEB PÁGINAS PARA INTERNET   PROGRAMAÇÃO WEB AVANÇADA    80
4   TECNOLOGIAS WEB PÁGINAS PARA INTERNET   DESENVOLVENDO COM JS    80
5   TECNOLOGIAS WEB PROGRAMAÇÃO WEB AVANÇADA    DESENVOLVENDO COM JS    80
6   null    PROGRAMAÇÃO WEB null    40

另一方面,在首先应用
groupby
之前,不要忘记将
null
值转换为字符串或除
None
以外的任何值,因为
groupby
尚不支持分组
None
。完成后,您始终可以将字符串
null
值转换为实
None

最后一行和带有“BANCO DE DADOS”的行不是一对的一部分。这些案例的确切逻辑是什么?最后一行和带有“护墙板”的一行在a类和b类之间没有等价性。顺便说一句,这些案例可以排除。排除-你的意思是从结果中删除吗?是的,它们并不重要,因为它们没有等价性。我想让他们在数据集中检查错误寄存器的LCASE,比如“technologies-1st períod”-“technologies”-“technologies-2nd”,它们可能是相同的等价物,但在解决了第一部分之后,我将处理这些情况谢谢,成功了!它给了我两对,但我能处理得很好。没问题。但我不确定上述答案是否会产生重复的案例,请您再次检查?我对成对使用了
itertools.compositions
,以避免重复案例。此外,如果你看答案的输出,它与上面问题中的预期输出是相同的。无论如何,如果你认为答案有效,请别忘了投赞成票。这是一个惊人的解决方案。它没有给我重复的一对。非常感谢你!谢谢:)你介意为后代接受答案(点击灰色复选标记并将其变成绿色)吗?
    equivalences    class a class b ch
0   AMBIENTE WEB    APLICAÇÕES EM NUVENS    ALTA DISPONIBILIDADE    80
1   BANCO DE DADOS  GERENCIANDO SEU BD  null    40
2   ETICA CONTABIL  A ÉTICA CONTÁBIL    A ÉTICA CONTÁBIL COM ENFOQUE    80
3   TECNOLOGIAS WEB PÁGINAS PARA INTERNET   PROGRAMAÇÃO WEB AVANÇADA    80
4   TECNOLOGIAS WEB PÁGINAS PARA INTERNET   DESENVOLVENDO COM JS    80
5   TECNOLOGIAS WEB PROGRAMAÇÃO WEB AVANÇADA    DESENVOLVENDO COM JS    80
6   null    PROGRAMAÇÃO WEB null    40