基于含重复SongId的DataFrame生成Artist配对排列组合DataFrame
解决重复SongId的ArtistId配对问题
嘿,我来帮你搞定这个需求!针对你有重复SongId的DataFrame,要生成包含所有ArtistId两两组合的新DataFrame,用Python的pandas配合itertools就能轻松实现,具体步骤如下:
1. 导入必要的库
首先需要导入pandas处理DataFrame,以及itertools里的combinations来生成两两组合:
import pandas as pd from itertools import combinations
2. 定义生成配对的函数
写一个函数,针对每个SongId分组,提取所有ArtistId并生成不重复的两两组合:
def generate_artist_pairs(group): # 提取当前分组的所有ArtistId到列表中 artist_list = group['ArtistId'].tolist() # 生成所有两两无序组合(避免重复的反向配对,比如A-B和B-A只保留一组) artist_pairs = list(combinations(artist_list, 2)) # 将组合转换成指定列名的DataFrame return pd.DataFrame(artist_pairs, columns=['Artist1', 'Artist2'])
3. 分组应用函数生成结果
假设你的原始DataFrame名为df,通过groupby按SongId分组,再应用上面的函数即可得到结果:
# 生成最终的配对DataFrame result_df = df.groupby('SongId').apply(generate_artist_pairs).reset_index(drop=True)
测试示例
用你给出的例子测试一下:
# 构造测试用的原始DataFrame test_data = { 'SongId': [0, 0, 16, 16, 16, 16], 'ArtistId': [6169, 2576, 12992, 2948, 9895, 5599] } df = pd.DataFrame(test_data) # 生成结果 result_df = df.groupby('SongId').apply(generate_artist_pairs).reset_index(drop=True) print(result_df)
运行后输出的结果完全符合你的要求:
Artist1 Artist2 0 6169 2576 1 12992 2948 2 12992 9895 3 12992 5599 4 2948 9895 5 2948 5599 6 9895 5599
可选:保留SongId列
如果需要在结果中保留对应的SongId,可以修改最后一步的代码:
result_df = df.groupby('SongId').apply(generate_artist_pairs).reset_index(level=0)
这样结果里会多一列SongId,方便你对应每个配对所属的歌曲。
内容的提问来源于stack exchange,提问作者user9740061
相关产品推荐
相关产品推荐

