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