熊猫组合相似行的列值

时间:2021-05-07 19:19:22

标签: python pandas

我有一个数据框,其中包含具有唯一列值的相似行。如果任何行具有重复的值组合,我需要将唯一值连接到每一行的列中。

样本数据

| 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 行中的前三列匹配。我想连接标题,以便每一行都包含匹配行的标题组合。

3 个答案:

答案 0 :(得分:2)

让我们试试groupby transform

df['title'] = df.groupby(
    ['program', 'subject', 'course'], as_index=False, sort=False
)['title'].transform('-'.join)
print(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

答案 1 :(得分:2)

使用 networkx 进行实验以匹配准确的预期输出,可能是过度设计:

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

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

答案 2 :(得分:0)

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

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

# dropping duplicate values
result.drop_duplicates(keep=False,inplace=True)
相关问题