如何用Pandas将ASCAP CSV中同歌曲的多行数据合并为单行?
用Pandas处理ASCAP多行CSV转单行的解决方案
看起来你已经走对了第一步——通过groupby('TITLE')把同一首歌的行归到了一起,接下来只需要在每个分组里提取对应信息,整合成单行就可以了。下面是完整的实现代码,以及分步解释:
完整代码
import pandas as pd # 读取大体积CSV文件,low_memory=False避免类型推断警告 data = pd.read_csv("COMMA_ASCAP_TEXT.txt", low_memory=False) # 初始化空列表存储整理后的单行数据 processed_data = [] # 遍历每个歌曲分组 for song_title, group in data.groupby('TITLE'): # 提取ASCAP份额行的SHARES和NOTE值 share_info = group[group['ROLE_TYPE'] == 'ASCAP'].iloc[0] shares_value = share_info['SHARES'] note_value = share_info['NOTE'] # 收集所有作者(ROLE_TYPE=W),去重后用逗号分隔 writers = ', '.join(group[group['ROLE_TYPE'] == 'W']['NAME'].dropna().unique()) # 收集所有表演者(ROLE_TYPE=P),同理处理 performers = ', '.join(group[group['ROLE_TYPE'] == 'P']['NAME'].dropna().unique()) # 将当前歌曲的整理信息添加到结果列表 processed_data.append({ 'TITLE': song_title, 'WRITER': writers, 'PERFORMER': performers, 'SHARES': shares_value, 'NOTE': note_value }) # 转换为DataFrame并保存为新的CSV final_df = pd.DataFrame(processed_data) final_df.to_csv("formatted_ascap_songs.csv", index=False)
关键步骤解释
- 读取大文件:使用
low_memory=False是因为你的CSV文件体积大,Pandas默认的类型推断可能会抛出警告,这个参数可以避免这类问题。 - 提取份额数据:每个分组里
ROLE_TYPE为ASCAP的行就是你需要的份额行,用iloc[0]直接取第一行(每个歌曲只会有一行ASCAP份额记录)。 - 整理作者/表演者:
- 筛选对应角色的行,提取
NAME列 dropna()处理空值,unique()去重(避免同一作者/表演者重复出现)- 用
,拼接成字符串,这样多个作者/表演者会以逗号分隔,符合CSV的可读性要求
- 筛选对应角色的行,提取
- 保存结果:最后把整理好的列表转成DataFrame,用
to_csv保存时加上index=False,避免生成不必要的索引列。
边界情况处理
- 如果某首歌没有表演者(没有
ROLE_TYPE=P的行),PERFORMER列会显示为空字符串,不会影响CSV格式 - 如果同一首歌有多个作者/表演者,会自动拼接成逗号分隔的字符串,保持数据的完整性
内容的提问来源于stack exchange,提问作者Zach Cutshall
相关产品推荐
相关产品推荐

