如何从DataFrame列生成歌曲创作者的全排列组合新DataFrame?
解决方案
要实现这个需求,我们可以借助pandas处理数据,结合itertools.combinations生成创作者的两两配对(从你的示例来看,你需要的是无重复的单向配对,而非严格意义上的全排列——因为示例里没有反向的组合,比如Tupac Shakur, Prince这种)。以下是具体步骤:
步骤1:导入依赖库
首先导入所需工具:
import pandas as pd from itertools import combinations
步骤2:处理原始DataFrame
假设你的原始DataFrame名为df,其中Song列是歌曲名,Writer列是用逗号分隔的创作者字符串(如你提供的示例图所示)。先把每个歌曲的创作者分割成列表:
# 将Writer列的字符串分割为创作者列表 df['writers_list'] = df['Writer'].str.split(', ', expand=False)
步骤3:生成创作者组合并构建新DataFrame
遍历每一行,为每个歌曲的创作者列表生成所有2元素的组合,再整理成目标格式的DataFrame:
# 初始化空列表存储结果 result_rows = [] for _, row in df.iterrows(): song_name = row['Song'] writers = row['writers_list'] # 生成所有不重复的两两创作者组合 for writer_pair in combinations(writers, 2): result_rows.append({ 'Song': song_name, 'Writer1': writer_pair[0], 'Writer2': writer_pair[1] }) # 转换为最终的新DataFrame new_df = pd.DataFrame(result_rows)
如果你不需要保留歌曲名,只需删除代码中Song相关的字段即可。
验证结果
以你给出的《03 Bonnie & Clyde》为例,运行代码后生成的对应行将和你示例的格式一致(示例里的Tupac S应该是输入笔误,实际会保留完整的Tupac Shakur):
Song Writer1 Writer2 0 03 Bonnie & Clyde Prince Tupac Shakur 1 03 Bonnie & Clyde Prince Jay-Z 2 03 Bonnie & Clyde Prince Tyrone Wrice 3 03 Bonnie & Clyde Prince Kanye West 4 03 Bonnie & Clyde Tupac Shakur Jay-Z 5 03 Bonnie & Clyde Tupac Shakur Tyrone Wrice 6 03 Bonnie & Clyde Tupac Shakur Kanye West 7 03 Bonnie & Clyde Jay-Z Tyrone Wrice 8 03 Bonnie & Clyde Jay-Z Kanye West 9 03 Bonnie & Clyde Tyrone Wrice Kanye West
特殊场景补充
如果你的原始DataFrame是同一歌曲对应多行创作者(即每一行是一个歌曲的单个创作者),处理方式只需调整分组逻辑:
# 按歌曲分组,收集每个歌曲的创作者列表 grouped_df = df.groupby('Song')['Writer'].apply(list).reset_index() # 后续生成组合的逻辑和之前一致 result_rows = [] for _, row in grouped_df.iterrows(): writers = row['Writer'] for writer_pair in combinations(writers, 2): result_rows.append({ 'Writer1': writer_pair[0], 'Writer2': writer_pair[1] }) new_df = pd.DataFrame(result_rows)
这样就能完美匹配你的需求啦!
内容的提问来源于stack exchange,提问作者joe borg
相关产品推荐
相关产品推荐

