You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于含重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:09:13