在python中基于特定的dataframe列获取组合
我有一个包含3列的数据框架:equivalences、class、ch。我使用的是Python在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
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