Python 熊猫组合相似行的列值

Python 熊猫组合相似行的列值,python,pandas,Python,Pandas,我有一个dataframe,它具有具有唯一列值的类似行。如果任何一行有重复的值组合,我需要将唯一的值连接到每一行的一列中 样本数据 | program | subject | course | title | |:------- |:------- |:------ |:----- | |music | eng | 101 | 000 | |music | math | 101 | 123 | |music | eng | 102

我有一个dataframe,它具有具有唯一列值的类似行。如果任何一行有重复的值组合,我需要将唯一的值连接到每一行的一列中

样本数据

| program | subject | course | title |
|:------- |:------- |:------ |:----- |
|music    | eng     | 101    | 000   |
|music    | math    | 101    | 123   |
|music    | eng     | 102    | 000   |
|music    | math    | 101    | 456   |
|art      | span    | 201    | 123   |
|art      | hst     | 101    | 000   |
|art      | span    | 201    | 456   |
|art      | span    | 202    | 000   |
期望数据

| program | subject | course | title.   |
|:------- |:------- |:------ |:-----    |
|music    | eng     | 101    | 000      |
|music    | math    | 101    | 123-456  |
|music    | eng     | 102    | 000      |
|music    | math    | 101    | 456-123  |
|art      | span    | 201    | 123-456  |
|art      | hst     | 101    | 000      |
|art      | span    | 201    | 456-123  |
|art      | span    | 202    | 000      |

第2行和第4行以及第5行和第7行中的前三列匹配。我想连接标题,使每一行包含匹配行的标题组合。

您可以合并两个数据帧,然后删除重复的行

frames = [df1, df2]
result = pd.concat(frames)

# dropping duplicate values
result.drop_duplicates(keep=False,inplace=True)
让我们试试:

df['title']=df.groupby(
['program'、'subject'、'course'],如索引=False,排序=False
)['title'].transform('-'.join)
打印(df)
输出:

  program subject  course    title
0   music     eng     101      000
1   music    math     101  123-456
2   music     eng     102      000
3   music    math     101  123-456
4     art    span     201  123-456
5     art     hst     101      000
6     art    span     201  123-456
7     art    span     202      000
试验以匹配准确的预期输出,可能设计过度:

import networkx as nx

u = df.assign(k=df.groupby(['program','subject','course']).ngroup())
G = nx.from_pandas_edgelist(u,'title','k',create_using=nx.DiGraph())
l =[f"{a}-{''.join(b.difference([a]))}".rstrip("-") 
 for a,b in zip(u['title'],u['k'].map(lambda x: nx.ancestors(G,x)))]
df['new_title'] = l


这假设只有两个副本?如果有3个呢?现在,只有两个副本。看起来它的价值,这应该足够了。谢谢。我不确定这个问题是否需要额外的计算时间来执行列表中的排序,就像您所做的那样。因为主请求似乎只是“将每行的唯一值连接到一列中”是的,并且只有两个重复项,我想人们可以接受它:)不需要复杂化
print(df)

  program subject course title new_title
0   music     eng    101   000       000
1   music    math    101   123   123-456
2   music     eng    102   000       000
3   music    math    101   456   456-123
4     art    span    201   123   123-456
5     art     hst    101   000       000
6     art    span    201   456   456-123
7     art    span    202   000       000